md5 Hash-Kollisionen.

8

Wenn von 1 bis X gezählt wird, wobei X die erste Zahl ist, die eine md5-Kollision mit einer vorherigen Zahl hat, welche Zahl ist X?

Ich möchte wissen, ob ich md5 für Seriennummern verwende, wie viele Einheiten ich erwarten kann, bevor ich eine Kollision bekomme.

    
John Lewis 30.07.2011, 19:59
quelle

6 Antworten

5

Theoretisch können Sie Kollisionen für X um 2 64 erwarten. Bei einer Hash-Funktion mit einer Ausgabe von n Bits treten erste Kollisionen auf, wenn Sie etwa 2 n / 2 -Ausgänge angesammelt haben (es spielt keine Rolle, wie Sie die Eingaben wählen; sequentiell ganzzahlige Werte sind in dieser Hinsicht nichts besonderes).

Natürlich wurde MD5 nicht als gute Hash-Funktion gezeigt. Auch ist das 2 n / 2 nur ein Durchschnitt. Also, warum versuchst du es nicht? Nehmen Sie eine MD5-Implementierung, hashen Sie Ihre Seriennummern und sehen Sie, ob Sie eine Kollision bekommen. Eine grundlegende MD5-Implementierung sollte in der Lage sein, einige Millionen Werte pro Sekunde zu hashen, und mit einer vernünftigen Festplatte könnten Sie einige Milliarden Ausgaben sammeln, sortieren und sehen, ob es eine Kollision gibt.

    
Thomas Pornin 31.07.2011, 02:01
quelle
2

Ich kann Ihre Frage nicht beantworten, aber Sie suchen nach einer UUID . UUID-Seriennummern können für Millionen von Produkten eindeutig sein, aber Sie müssen möglicherweise eine Datenbank überprüfen, um die geringe Wahrscheinlichkeit einer Kollision zu verringern.

    
Azsgy 02.03.2014 19:12
quelle
1

Ich glaube, niemand hat dies getestet.

Wenn Sie eine einfache inkrementelle Zahl haben, müssen Sie sie nicht hashen

    
dynamic 30.07.2011 20:04
quelle
1

Soweit ich weiß, gibt es keine bekannten Kollisionen in md5 für 2 ^ 32 (Größe einer ganzen Zahl)

    
Spacefish 05.03.2014 16:22
quelle
0

Es hängt wirklich von der Größe Ihrer Eingabe ab. Eine perfekte Hash-Funktion hat Kollisionen jeder (input_length / hash_length) Hashes. Wenn Ihre Eingabe klein ist, sind Kollisionen ziemlich unwahrscheinlich, bis jetzt gab es nur eine einzige Ein-Block-Kollision.

    
pezcode 30.07.2011 20:06
quelle
0
Ich weiß, dass dies eine alte Frage ist, aber ich stolperte darüber, fand einen viel besseren Ansatz und dachte, ich würde es teilen.

Sie haben eine obere Grenze für Ihre Ordnungszahl N, also nutzen wir das aus. Sagen wir N & lt; 2 32 ≈ 4,3 * 10 10 . Jetzt, jedes Mal, wenn Sie eine neue Kennung benötigen, wählen Sie einfach eine zufällige 32-Bit-Zahl R und verketten sie mit R x oder N (Zero-Pad vor der Verkettung). Dies ergibt eine zufällig aussehende eindeutige 64-Bit-Kennung, die Sie mit nur 16 hexadezimalen Ziffern bezeichnen könnten.

Dieser Ansatz verhindert Kollisionen vollständig, da zwei Identifikatoren, die zufälligerweise die gleiche zufällige Komponente aufweisen, notwendigerweise bestimmte xor-ed Komponenten haben.

Bonus-Feature: Sie können einen solchen 64-Bit-Identifier in zwei 32-Bit-Zahlen aufteilen und sie miteinander verknüpfen, um die ursprüngliche Ordnungszahl wiederherzustellen.

    
OscarJ 05.05.2016 08:35
quelle

Tags und Links