11 Stimmen

Schockierende Kollisionen des adler32-Hashes

Bei der Verwendung von adler32() als Hashfunktion sollte man seltene Kollisionen erwarten.

Wir können die genaue Wahrscheinlichkeitsberechnung für Kollisionen durchführen, aber grob gesagt,
da es sich um eine 32-Bit-Hashfunktion handelt, sollten auf einer Stichprobe von einigen tausend Elementen nicht viele Kollisionen auftreten.

Dies ist kaum der Fall.

Hier ist ein Beispiel: Lassen Sie uns Zeichenfolgen nehmen, die ein Datum in der Mitte enthalten, so etwas wie

"Einige Präfixtext " + Datum + " etwas Postfixtext."

wobei das Datum im Format JJJJ-MM-TT ist und wir über das Jahr 2012 iterieren.

In diesem Beispiel gibt es 91 Kollisionen!

Noch schlimmer: Es gibt 7 Fälle, in denen sich 3 Daten kollidiert haben.

Wie kann es sein, dass eine so häufig verwendete Hashfunktion so schlecht abschneidet?
Oder habe ich etwas übersehen?

Hier sind die detaillierten Ergebnisse des obigen Beispiels:

0x592a0f1f: 2012-01-30, 2012-02-02, 2012-10-21
0x592b0f1f: 2012-02-11, 2012-10-30, 2012-11-02
0x593d0f20: 2012-01-31, 2012-02-03, 2012-10-22
0x593e0f20: 2012-02-12, 2012-10-31, 2012-11-03
0x59410f20: 2012-03-11, 2012-11-30, 2012-12-02
0x59560f21: 2012-03-30, 2012-04-02, 2012-12-21
0x59690f22: 2012-03-31, 2012-04-03, 2012-12-22

(und so weiter...)

22voto

Mark Adler Punkte 87756

Adler-32 sollte nie eine Hash-Funktion sein und ist es auch nicht. Sein Zweck ist die Fehlererkennung nach der Dekomprimierung. Es erfüllt diesen Zweck gut, da es schnell ist und Fehler in den komprimierten Daten durch den Dekompressor verstärkt werden.

In den von Ihnen gegebenen Beispielen verwenden Sie Adler-32 auf sehr kurzen Zeichenfolgen, für die es nicht einmal die Chance hat, alle 32 Bits zu nutzen. Adler-32 benötigt mindestens ein paar hundert Bytes, um in Gang zu kommen.

Es gibt viele nicht-kryptografische Hash-Funktionen, die sehr schnell sind und sich gut verhalten, einschließlich der Vermeidung von Kollisionen. Werfen Sie einen Blick auf die CityHash-Familie von Hash-Funktionen.

Wenn Sie kryptografische (nicht fälschbare) Hash-Funktionen benötigen, schauen Sie sich SHA-2 und SHA-3 an.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X