2012-04-12 11 views
2

Eine akzeptierte Möglichkeit, zwei Hashes von verschiedenen Objekten zu kombinieren, ist die Verwendung von XOR. Dies ist sinnvoll, aber wie im zweiten Kommentar von Thomas Pornin im folgenden Post erwähnt, XOR ist kommutativ, was bedeutet, dass, wenn Sie jedes Element in einer Menge Hash-und kombinieren sie mit XOR, jede Reihenfolge, die Sie tun, wird immer dazu führen die gleiche Hash:Kombinieren von Hashes für eine geordnete Menge

Why is XOR the default way to combine hashes?

Was ist ein guter Weg Hashes zu kombinieren, die Sie Auftrag abhängig sein wollen? Wenn es für die Größe spezifisch ist, was sind einige bekannte Techniken für 32 Bit und für 64 Bit?

+0

Randnotiz, in einem bestimmten Fall habe ich eine Iterationsvariable 'i' von 0 bis zur Anzahl der Elemente. Gibt es eine gute Möglichkeit, 'i' zu verwenden, um einen auftragsabhängigen Hash zu erstellen? – Trevor

+0

Wenn Sie eine Reihenfolge festlegen möchten, können Sie die Teilhashes drehen (* nicht * verschieben), bevor Sie sie in das Aggregat kopieren. Dies kann natürlich Kollisionen verursachen (wie H (ABCD) == H (DABC)), aber das ist ein Teil des Spiels ... – wildplasser

+0

Im Moment mache ich etwas Dummes, wo ich 'ich' mit einer riesigen Primzahl multipliziere und xor das mit dem Hash für jedes Element. Es gibt Ordnung, aber ich bin definitiv kein Experte und ich habe keine Ahnung, ob das zu größeren Kollisionen führen würde. – Trevor

Antwort

1

Um die resultierende Hash-Reihenfolge abhängig zu machen, muss im Algorithmus ein sequentieller (d. H. Nicht-statischer) Aspekt vorhanden sein. Die gebräuchlichste Technik ist wahrscheinlich die von Cyclic Redundancy Checks (CRC).

CRC kann in Hardware als ein Schieberegister mit XOR-Ed-Feedback implementiert werden. Ein solches Schieberegister wirkt als deterministischer Zufallszahlengenerator. Wenn der Anfangszustand derselbe ist, wird er immer dieselbe Sequenz von Zuständen durchlaufen. Diese Zustände werden bei der CRC-Signaturberechnung verwendet, um die Daten in einer wiederholbaren Weise zu XOR zu machen.

Um zwei Hash-Werte zu kombinieren, würden Sie sie zusammen mit einem dritten Wert aus einem CRC-Algorithmus XOR. Dies könnte berechnet oder aus einer Look-up table.-

Beliebte CRC-Codes genommen werden:

09 bits (CRC-8) 
17 bits (CRC-16) 
33 bits (CRC-32) 
65 bits (CRC-64) 

Classless.Hasher mehr enthält Details.

C# - Implementierungen finden Sie in HashLib.