2015-08-04 12 views
7

Um es einfach zu machen, ist meine Frage: wie man einen String (etwa 200 Zeichen) so schnell wie möglich hasht. Sicherheit ist nicht wichtig, aber Kollisionen sind eine große Sache.Schnellster Hash-Algorithmus in Java für Strings

Hinweis: Nach einer kurzen Untersuchung scheint es so, als wäre MurmurHash3 die beste Wahl. Ich bin offen für jeden Kommentar zu sagen, sonst '

Erstens weiß ich, dass es viele andere ähnliche Frage, aber ich konnte keine überzeugende Antwort noch finden.

Ich habe eine Liste von Objekten, die jeweils eine Liste von etwa 3k Absätzen enthält, die in einer Datenbank gespeichert ist. Alle X Stunden werden diese Absätze neu generiert, und ich muss herausfinden, ob sich Absätze geändert haben, und wenn dies der Fall ist, nur diese neuen Absätze drücken.

Der schnellste Weg, um die Unterschiede zu finden (zu wissen, dass die meiste Zeit der Inhalt identisch sein wird), ist ein MerkleTree zu erstellen, speichern Sie es in der DB, und durchlaufen Sie den MerkleTree, um die Unterschiede statt zu finden Vergleichen Sie die Absätze selbst.

Dies impliziert in meinem Fall, dass ich zehntausend Hashes pro Sekunde erstellen werde, um mit dem zu vergleichen, was in der DB ist. Daher brauche ich eine sehr effiziente Möglichkeit, diese Hashes zu erstellen. Mir ist die Sicherheit egal, ich muss nur sicherstellen, dass die Anzahl der Kollisionen sehr, sehr niedrig bleibt.

Was wäre der beste verfügbare Algorithmus in Java?

In meinem Fall besteht das Hauptobjekt aus Abschnitten, die aus Sprachen besteht, die aus Absatz besteht. Der Vergleich Strategie ist:

1) Wenn das Objekt Hash identisch ist, stoppen, gehen sonst zu 2)

2) Schleife auf alle Abschnitt, halten nur der Abschnitt mit einem anderen Hash

3) Schleife in allen Sprachen dieser Sektionen, behalte nur die Sprache mit einem anderen Hash

4) Loop auf allen Absatz aller dieser Sprachen, wenn der Hash ist anders, dann schieben Sie den neuen Inhalt.

+2

Siehe auch: [Welche Hashing-Algorithmus ist am besten für Einzigartigkeit und Geschwindigkeit?] (Http://programmers.stackexchange.com/q/49550/88986) – durron597

+0

finde ich die Frage eher Unklar, müssen Sie nur entscheiden, ob sich ein * spezifischer * Objektabsatz geändert hat oder ist die Idee * zu finden *, zu welchem ​​Objekt ein Absatz gehört (dh was ist der Primärschlüssel?). – Durandal

+0

Siehe auch http://stackoverflow.com/questions/2624192/good-hash-function-for-strings – slartidan

Antwort

5

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

Die kurze Version ist, verwenden Sie FNV-1a, aka the Fowler–Noll–Vo hash function, hat es eine hervorragende Leistung, hohe Zufälligkeit und niedrigen Kollisionen.

Jede weitere Erklärung, die ich auf diese Frage werfen könnte, wäre nur ein Kopieren und Einfügen von dieser Programmers.SE Antwort, die übrigens die zweithöchste Antwort auf der gesamten Website ist.

Einige andere Gedanken:

  • Letztendlich haben Sie eine ziemlich Use-Case-Nische. Die meisten Menschen beschäftigen sich nicht regelmäßig mit 1 Milliarde Eingangsdatensätzen. Daher müssen Sie möglicherweise Ihr eigenes Benchmarking durchführen.
  • Das heißt, eine hohe Zufälligkeit deutet darauf hin, dass der Algorithmus wahrscheinlich gut für englische Hashes skalieren wird.
  • Sie haben nicht wirklich über andere Themen gesprochen; Können Sie den gesamten Datensatz im Speicher behalten? Was sind Ihre Fußabdruckanforderungen?

Siehe auch: Fastest Hash Algorithm for Text Data

+0

Klingt cool, aber ich bin ein wenig enttäuscht, Kollision auf einem Datensatz von nur 250k zu sehen. Um es klar zu sagen, Kollision ist eine große Sache für mich, und ich habe über 1 Milliarde Einträge. Wenn Sie einen Algorithmus mit mehr als 2^128 Möglichkeiten betrachten, erwarten Sie keine Kollision auf solch einem kleinen Datensatz? –

+2

Wenn Sie über den Grund für die Kollision nachdenken, ist es eher normal. Die Kollisionen passieren bei Ein-Wort-Daten, so dass die Daten tatsächlich sehr kompakt sind und Kollisionen normal sind. Je größer die Daten, desto geringer die Kollision. Sie sagen, Sie haben ganze Absätze, testen Sie die Algorithmen auf den ersten 250.000 Absätzen, die Sie haben, und überprüfen Sie die Kollisionen in Ihrem tatsächlichen Kontext und nicht in dem spezifischen Kontext des Kerls. –

+0

Ich bin bereit, das zu kaufen. Haben Sie eine Erklärung, warum ein kürzerer String eine größere Chance hätte zu kollidieren oder ist das nur eine Theorie? –