Die boost::hash_combine
Vorlagenfunktion verweist auf einen Hash (aufgerufen seed
) und ein Objekt v
. Laut den Dokumenten wird es seed
mit dem Hash von v
by kombiniert
seed ^= hash_value(v) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
Ich kann sehen, dass dies deterministisch ist. Ich verstehe, warum ein XOR verwendet wird.
Ich wette, der Zusatz hilft bei der Abbildung ähnlicher Werte weit auseinander, damit die Hash-Tabellen nicht zusammenbrechen. Aber kann jemand erklären, was die magische Konstante ist?
Antworten:
Die magische Zahl soll 32 zufällige Bits sein, wobei jedes gleich wahrscheinlich 0 oder 1 ist und keine einfache Korrelation zwischen den Bits besteht. Ein üblicher Weg, eine Folge solcher Bits zu finden, besteht darin, die binäre Erweiterung einer irrationalen Zahl zu verwenden; In diesem Fall ist diese Zahl der Kehrwert des Goldenen Schnitts:
Das Einbeziehen dieser Zahl "zufällig" ändert also jedes Bit des Samens; Wie Sie sagen, bedeutet dies, dass aufeinanderfolgende Werte weit voneinander entfernt sind. Durch das Einbeziehen der verschobenen Versionen des alten Seeds wird sichergestellt, dass sich
hash_value()
Unterschiede , selbst wenn sie einen relativ kleinen Wertebereich aufweisen, bald auf alle Bits verteilen.quelle
0x9e3779b97f4a7800
0x9e3779b97f4a7c15
.0x9e3779b97f4a7c16
? Ich meine, es ist nur 1 aus.Schauen Sie sich den DDJ-Artikel von Bob Jenkins aus dem Jahr 1997 an . Die magische Konstante ("goldener Schnitt") wird wie folgt erklärt:
quelle