Die Sache, die Sie mit einer Hash-Funktion erreichen wollen, besteht darin, allen Bits im Hash-Code eine Chance von 50% zu geben, ein- oder ausgeschaltet zu sein.Auf diese Weise ist es egal, wie viele "Buckets" Ihre Hash-Tabelle hat (oder einen anderen Weg, wie viele der unteren Bits nehmen Sie, um die Bucket-Nummer zu bestimmen) - wenn alle Bit ist so zufällig wie möglich, dann wird ein Artikel immer einem im Wesentlichen zufälligen Bucket zugewiesen.
Jetzt, im wirklichen Leben, verwenden viele Leute Hash-Funktionen, die nicht so gut sind. Sie haben einige Zufälligkeit in einigen der Bits, aber nicht alle von ihnen. Stellen Sie sich zum Beispiel vor, wenn Sie eine Hash-Funktion haben, deren Bits 6-7 voreingenommen sind - sagen wir, in dem typischen Hash-Code eines Objekts haben sie eine Wahrscheinlichkeit von 75% gesetzt zu werden. Wenn in diesem Beispiel unsere Hash-Tabelle 256 Buckets hat (dh die Bucket-Nummer kommt aus den Bits 0-7 des Hash-Codes), dann werfen wir die Zufälligkeit weg, die in den Bits 8-31 existiert, und eine kleinere Ein Teil der Eimer wird dazu neigen, gefüllt zu werden (dh diejenigen, deren Zahlen die Bits 6 und 7 gesetzt haben).
Die zusätzliche Hash-Funktion versucht grundsätzlich, die in den Hash-Codes vorhandene Zufälligkeit über eine größere Anzahl von Bits zu verteilen. In unserem hypothetischen Beispiel wäre also die Idee, dass etwas von der Zufälligkeit von den Bits 8-31 mit den unteren Bits gemischt wird und die Vorspannung der Bits 6-7 verdünnt wird. Es wird immer noch nicht perfekt sein, aber besser als vorher.
Eine gute Hash-Funktion sollte auch _very_ verschiedene Hashes für ähnliche Werte erstellen. Auch wenn sich die Elemente A und B nur in einem Bit unterscheiden, sollten ihre Hashes sehr unterschiedlich sein. – Piotr
Ich habe diese Aufschrift immer gemocht: http: //www.eternallyconfuzzled.com/tuts/algorithmen/jsw_tut_hashing.aspx – Joe