2008-09-26 9 views
19

Ich erstelle eine GUID (als String) und bekomme den Hash davon. Kann ich diesen Hash als einzigartig betrachten?Ist der Hash einer GUID eindeutig?

+1

Auch die meisten Antworten sind irgendwie zufällig und weniger hilfreich als sie sein könnten, weil niemand die Frage und ihre zugrunde liegende Absicht wirklich versteht. Eine Klarstellung würde diese Frage und ihre Antworten nützlicher machen. – bzlm

Antwort

17

Nicht so zuverlässig wie die GUID selbst, nein.

Um zu erweitern, reduzieren Sie Ihre Eindeutigkeit um einen Faktor von 4, von 16 Bytes zu 4 Bytes von möglichen Kombinationen.

Wie in den Kommentaren darauf hingewiesen wird die Hash-Größe einen Unterschied machen. Das 4-Byte-Ding war eine Annahme, schrecklich im besten Fall, ich weiß, dass es in .NET verwendet werden kann, wo die Standard-Hash-Größe 4 Bytes (int) ist. Sie können also das, was ich oben gesagt habe, durch die Byte-Größe ersetzen, die Ihr Hash sein könnte.

+3

4 Wenn der Hash-Algorithmus perfekt ist und der Hash-Wert 4 mal weniger Bits enthält als die GUID - beide variieren wahrscheinlich je nach Kontext, oder? – bzlm

+1

Kryptographische Hashes (z. B. MD5, SHA1) sind 16-20 oder mehr Byte.Durch Hashing der GUID mit einem solchen Hash wird die Eindeutigkeit nicht reduziert. – zvrba

+1

Tatsächlich könnte das Risiko einer Kollision * nach dem Hash-Vorgang * zunehmen *, selbst wenn der Hash-Wert größer als der GUID-Wert ist. Es hängt vom Algorithmus ab. – bzlm

2

Es ist nicht garantiert zu sein, wegen Hash-Kollisionen. Die GUID selbst ist fast garantiert.

Aus praktischen Gründen können Sie wahrscheinlich annehmen, dass ein Hash eindeutig ist, aber warum nicht die GUID selbst verwenden?

6

Mit einem Wort, nein.

Nehmen wir an, Ihr Hash hat weniger Bits als die GUID. Nach dem "pigeon hole" -Prinzip müssen mehrere GUID -> Hashs existieren, weil es weniger Hashes als GUIDS gibt.

Wenn wir davon ausgehen, dass der Hash eine größere Anzahl von Bits als die GUID hat, gibt es eine sehr kleine - aber begrenzte - Wahrscheinlichkeit einer Kollision, vorausgesetzt, Sie verwenden eine gute Hash-Funktion.

4

Keine Hash-Funktion, die einen beliebig großen Datenblock auf eine feste Anzahl von Bits reduziert, führt zu einer 1: 1-Zuordnung zwischen den beiden. Es wird immer eine Möglichkeit geben, dass zwei verschiedene Datenblöcke auf die gleiche Sequenz von Bits in dem Hash reduziert werden.

Gute Hash-Algorithmen minimieren die Wahrscheinlichkeit, dass dies geschieht, und im Allgemeinen gilt: Je mehr Bits im Hash enthalten sind, desto geringer ist die Wahrscheinlichkeit einer Kollision.

2

Nein, und ich würde nicht die Einzigartigkeit eines Hash-Wertes annehmen. Das sollte keine Rolle spielen, da Hash-Werte nicht eindeutig sein müssen, sondern nur gleichmäßig über ihren Bereich verteilt werden müssen. Je gleichmäßiger die Verteilung ist, desto weniger Kollisionen treten auf (in der Hashtabelle). Weniger Kollisionen bedeuten bessere Hashtable-Leistung.

FYI Für eine gute Beschreibung, wie Hash-Tabellen arbeiten, lesen Sie die akzeptierte Antwort auf What are hashtables and hashmaps and their typical use cases?

0

Wenn Sie verschlüsselten Hash verwenden (MD5, SHA1, RIPEMD160), wird der Hash eindeutig sein (Modulo Kollisionen, die sehr unwahrscheinlich sind - SHA1 wird zB für digitale Signaturen verwendet, und MD5 ist auch kollisionsresistent unter zufällige Eingaben). Warum möchten Sie jedoch eine GUID hashen?

Verwandte Themen