2009-05-13 3 views
11

Ich suche einen 32-Bit-Hash einiger Datenobjekte zu erstellen. Da ich keine eigene Hash-Funktion schreiben möchte und MD5 verfügbar ist, besteht meine derzeitige Vorgehensweise darin, die ersten 32 Bits (d. H. Die ersten 8 Hex-Ziffern) von einem MD5-Hash zu verwenden. Ist das akzeptabel?Sind die ersten 32 Bits eines MD5-Hashs genauso "zufällig" wie jede andere Teilkette?

Mit anderen Worten, sind die ersten 32 Bits eines MD5-Hash genau so "zufällig" wie jeder andere Teilstring? Oder gibt es einen Grund, warum ich sagen würde, die letzten 32 Bits? oder vielleicht die vier 32-Bit-Teilstrings XOR-Verknüpfung?

Einige preemptive Präzisierungen:

  • Diese Hashes brauchen nicht kryptographisch sicher zu sein.
  • Ich bin nicht mit der Leistung von MD5 betroffen - es ist mehr als schnell genug für meine Bedürfnisse.
  • Diese Hashes müssen nur "zufällig" genug sein, dass Kollisionen selten sind.
  • In diesem System sollte die Anzahl der Elemente 10.000 nicht überschreiten (realistisch wird es wahrscheinlich nicht halb so hoch werden). Im schlimmsten Fall sollte also die Wahrscheinlichkeit, dass überhaupt Kollisionen auftreten, bei etwa 1% liegen (vorausgesetzt, es wurde ein ausreichend "zufälliger" Hash gefunden).
+0

haben Sie bereits einen MD5-Hash berechnet? (z. B. als Teil der Metadaten eines Subversion-Checkins) oder müssen Sie den MD5-Hash selbst berechnen? Wenn letzteres, ich stimme mit @Johannes Kommentar, CRC32 wäre viel einfacher. –

+1

Anscheinend gibt es keine Möglichkeit auf SO, präventiv die "Ihre Frage ist ungültig, weil Sie es stattdessen tun sollten" Kommentare ... – Kip

+0

Sorry, ich wollte nicht * nicht * MD5-Hash verwenden, ich einfach bedeuten, ein CRC32 ist einfacher. Sie oder Ihre Kunden sind die einzigen, die beurteilen können, welche Algorithmen Ihren Anforderungen entsprechen. –

Antwort

10

Für jede gute Hash-Funktion sollten die einzelnen Bits ungefähr zufällig sein. Sie sollten daher sicher sein, nur die ersten 32 Bits eines MD5-Hash zu verwenden.

Alternativ könnten Sie auch CRC32 verwenden, das viel schneller zu berechnen sein sollte (und der Code ist etwa 20 Zeilen).

+0

"Ich bin nicht mit der Leistung von MD5 betroffen - es ist mehr als schnell genug für meine Bedürfnisse." – Kip

+3

Kip: Leistung oder nicht, CRC32 gibt Ihnen einen 32-Bit-Hash, der genau das ist, was Sie wollen. – dwc

9

Mit anderen Worten sind die ersten 32 Bits eines md5 Hash nur als "random" wie jeder andere Teilzeichen ?

Ja. Wenn die Antwort nein wäre, wäre MD5 nicht ausreichend sicher. (Sicher, es hat einige kryptografische Schwächen, aber mir sind keine statistischen bekannt)

+0

MD5 _istnicht_ ausreichend sicher, wie zahlreiche Angriffe gezeigt haben :) – Joey

+4

Diese Aussage trifft nur zu, wenn Qualifikationen hinzugefügt werden. Es ist nicht sicher genug, um alle Kollisionsangriffe unmöglich zu machen. Es ist (soweit) ausreichend sicher, um Urimage-Angriffe undurchführbar zu machen. siehe http://www.vpnc.org/hash.html –

+0

auch nicht zu bemängeln, aber mein Beitrag sagte nicht MD5 war ausreichend sicher. :-) –

1

Eine alte Frage hier, aber es kommt oft. Die Antwort ist ganz sicher NEIN, sonst müsste eine MD5-Zeichenfolge nicht mehr als 32 Bit lang sein.

Unabhängig davon ist eine MD5-Saite überhaupt nicht zufällig - sie ist vollständig und konsistent reproduzierbar bei gleichem Input (was ziemlich anti-random ist ;-)).

Ob es für Ihre Zwecke ausreichend ist oder nicht, hängt von Ihrem Zweck ab.