2015-08-04 1 views
7

Per semplificare, la mia domanda è: come hash una stringa (circa 200 caratteri) il più rapidamente possibile. La sicurezza non è importante, ma le collisioni SONO un grosso problema.Algoritmo Hash più veloce in Java per le stringhe

Nota: dopo un'indagine rapida, sembra che MurmurHash3 potrebbe essere la scelta migliore. Sono aperto a qualsiasi commento dicendo altrimenti th '

Innanzitutto, so che ci sono molte altre domande simili, ma non sono riuscito a trovare una risposta convincente.

Ho un elenco di oggetti, ciascuno contenente un elenco di circa 3k paragrafi che viene salvato in un database. Ogni X ore, quei paragrafi sono rigenerati e ho bisogno di trovare se qualche paragrafo è cambiato, e in tal caso, spingere solo quei nuovi paragrafi.

Il modo più veloce che ho trovato per trovare le differenze (sapendo che la maggior parte del tempo, il contenuto sarà identico) è quello di creare un MerkleTree, salvarlo al DB, e iterare il MerkleTree trovare le differenze, invece di confrontando i paragrafi stessi.

Ciò implica, nel mio caso, che creerò dieci migliaia di hash al secondo da confrontare con ciò che è nel DB. Pertanto, ho bisogno di un modo molto efficiente per creare quegli hash. Non mi interessa la sicurezza, ho solo bisogno di garantire che il numero di collisioni rimanga molto molto basso.

Quale sarebbe il miglior algoritmo disponibile in Java per quello?


Nel mio caso, l'oggetto principale è composto da sezioni, che si compone di Lingue, che si compone di paragrafo. La strategia di confronto è:

1) Se l'hash oggetto è identico, fermata, altrimenti vai a 2)

2) Loop su tutti Sezione, mantenere solo la sezione con un diverso hash

3) Effettua il loop su tutte le lingue di quelle sezioni, mantieni solo la lingua con un diverso hash

4) Effettua il ciclo su tutti i paragrafi di tutte quelle lingue, se l'hash è diverso, quindi invia il nuovo contenuto.

+2

See: [Quale algoritmo di hash che è meglio per l'unicità e la velocità?] (Http://programmers.stackexchange.com/q/49550/88986) – durron597

+0

trovo la domanda un po ' non è chiaro, hai solo bisogno di decidere se un paragrafo * specifico * degli oggetti è cambiato o è l'idea di * trovare * a quale oggetto appartiene un paragrafo (cioè qual è la chiave primaria?). – Durandal

+0

Dai un'occhiata anche a http://stackoverflow.com/questions/2624192/good-hash-function-for-strings – slartidan

risposta

5

This amazing answer on Programmers Stack Exchange tells you all you need to know.

La versione corta è, utilizzare FNV-1a, aka the Fowler–Noll–Vo hash function, ha prestazioni eccellenti, elevata casualità e bassi collisioni.

Qualsiasi ulteriore spiegazione che potrei fare su questa domanda sarebbe solo una copia e incolla da quella risposta Programmers.SE, che per inciso è la seconda risposta più votata sull'intero sito.

Alcuni altri pensieri:

  • In definitiva, si ha un caso abbastanza uso di nicchia. La maggior parte delle persone non ha a che fare con 1 miliardo di set di dati di ingresso regolarmente. Pertanto, potrebbe essere necessario eseguire il proprio benchmarking.
  • Detto questo, avere un'alta casualità suggerisce che l'algoritmo è in grado di adattarsi bene agli hash inglesi.
  • Non hai davvero parlato di altri problemi; sei in grado di conservare l'intero set di dati in memoria? Quali sono i tuoi requisiti di impronta?

Vedi anche: Fastest Hash Algorithm for Text Data

+0

I suoni sono fantastici, ma sono un po 'deluso di vedere la collisione su un set di dati di soli 250k. Per essere chiari, la collisione è un grosso problema per me e ho oltre 1 miliardo di voci. Quando si guarda un algoritmo con oltre 2^128 possibilità, non ci si aspetterebbe alcuna collisione su un dataset così piccolo? –

+2

Se si pensa al motivo della collisione, è piuttosto normale. Le collisioni avvengono su dati di una sola parola, quindi i dati sono in realtà molto compatti e le collisioni sono normali. Più grandi sono i dati, minore è la collisione. Dici di avere interi paragrafi, testare gli algoritmi sui primi 250k paragrafi che hai e controllare le collisioni nel tuo contesto reale piuttosto che nel contesto specifico del ragazzo. –

+0

Sono disposto a comprarlo. Detto questo, hai una spiegazione sul perché una stringa più corta avrebbe maggiori possibilità di collisione o è solo una teoria? –