Ich erstelle eine GUID (als String) und bekomme den Hash davon. Kann ich diesen Hash als einzigartig betrachten?Ist der Hash einer GUID eindeutig?
Antwort
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.
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
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
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
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?
Nein.
Sehen Sie hier, wenn Sie eine Mini-GUID wollen: http://blogs.msdn.com/oldnewthing/archive/2008/06/27/8659071.aspx
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.
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.
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?
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?
- 1. Ist es sicher anzunehmen, dass eine GUID immer eindeutig ist?
- 2. Was ist der Unterschied zwischen einer "nonce" und einer "GUID"?
- 3. Umwandlung einer Guid in Nullable Guid
- 4. Was ist die String-Länge einer GUID?
- 5. MYSQL SELECT DISTINCT ist nicht eindeutig in der PHP, aber ist in der Datenbank eindeutig
- 6. Ist HKEY_LOCAL_MACHINE \ SOFTWARE \ Microsoft \ Cryptography \ MachineGuid eindeutig?
- 7. Was ist diese GUID?
- 8. Was ist der Standardwert für Guid?
- 9. Wie kann sichergestellt werden, dass eine generierte GUID global eindeutig ist?
- 10. Wie Sie eine GUID und einen 64-Bit-Zeitstempel in eine andere GUID hashen
- 11. was ist der kürzeste Hash/
- 12. GUID aus einer Zeichenfolge generieren, die nicht im GUID-Format ist
- 13. SQL-Abfrage - eindeutig oder eindeutig?
- 14. Ist die TimeStamp-Spalte eindeutig?
- 15. Was ist der Tree-Hash eines bestimmten Commit-Hash?
- 16. Was ist CLSID? Ist es eine GUID?
- 17. Inkrementieren Guid in C#
- 18. Ist der Netty-Handler für jede Verbindung eindeutig?
- 19. DXF/DWG-Interna: Ist der Name eines Blocks eindeutig?
- 20. wenn dritte Spalte in der Datei nicht eindeutig zuzuordnen ist
- 21. Ist der iPhone Simulator UDID für jede installierte Instanz eindeutig?
- 22. Nullable GUID
- 23. eindeutig identifizieren IPhone auf einer Web-Anwendung
- 24. Ist das wirklich "korrekt" und eindeutig?
- 25. DispID muss über Schnittstellen hinweg eindeutig sein?
- 26. Erzeugen einer neuen Random GUID in der Delphi IDE
- 27. IndexPath.row ist nicht eindeutig für statische Zellen
- 28. Wenn Heap erstellt wird, ist Heap eindeutig?
- 29. Warum ist dieser Code nicht eindeutig?
- 30. IntegrityError: Spalte Name1 ist nicht eindeutig
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