Warum ist die XOR-Operation der Standard-Weg, um zu kombinieren hashes?

Sagen, Sie haben zwei hashes H(A) und H(B) und Sie wollen, Sie zu kombinieren. Ich habe gelesen, dass ein guter Weg, um zu kombinieren zwei hashes zu XOR Ihnen, z.B. XOR( H(A), H(B) ).

Die beste Erklärung, die ich gefunden habe berührt, wird hier kurz auf diese hash-Funktion-Richtlinien:

XORing zwei zahlen mit etwa zufällige Verteilung ergibt sich eine andere Zahl noch mit etwa zufällige Verteilung*, aber das kommt jetzt auf die beiden Werte.

...

* An jedem bit der beiden zahlen zu kombinieren, wird eine 0 ausgegeben wird, wenn die beiden bits gleich sind, sonst eine 1. In anderen Worten, in 50% der Kombinationen, eine 1 ausgegeben wird. Also, wenn die zwei Eingangs-bits jeweils eine ungefähr 50-50 chance, 0 oder 1, dann werden auch die Ausgangs-bit.

Können Sie erklären, der intuition und/oder der Mathematik dahinter, warum XOR sollten die Standard-Betrieb für die Kombination von hash-Funktionen (anstatt ODER-oder UND usw.)?

Ich denke, dass du gerade getan hast 😉
beachten Sie, dass die XOR sein kann oder nicht, ein "guter" Weg zu "kombinieren" - hashes, je nachdem, was Sie wollen, in einer "Kombination". XOR-Verknüpfung ist kommutativ: XOR(H(A),H(B)) entspricht der XOR - (H(B),H(A)). Dies bedeutet, dass die XOR ist nicht eine richtige Weg, um erstellen Sie eine Art von hash, der eine geordnete Sequenz von Werten, denn es erfasst nicht die Reihenfolge.
Neben dem Problem mit der Bestellung (Kommentar oben), gibt es problem mit gleichen Werten. XOR(H(1), H(1))=0 (für eine beliebige Funktion H), XOR(H(2) H(2))=0 und so weiter. Für beliebiges N: XOR(H(N) H(N))=0. Werte gleich oft passiert in realen Anwendungen, und es bedeutet, dass das Ergebnis der XOR-0 zu oft als gutes Haschisch.
Was benutzt du für geordnete Folge von Werten ? Sagen wir mal ich möchte einen hash des Zeitstempels oder eines index. (MSB weniger wichtig als LSB). Sorry, falls dieser thread ist 1 Jahr alt.
Verwandte: Was ist der beste Algorithmus für eine überschriebene System.Objekt.GetHashCode?

InformationsquelleAutor Nate Murray | 2011-05-04

Schreibe einen Kommentar