Wie man eine gute hash_combine mit 64 bit Ausgabe erzeugt (inspiriert von boost :: hash_combine)

8

Momentan hat Boost die Funktion hash_combine, die eine 32-Bit-Ganzzahl ohne Vorzeichen ausgibt (genauer gesagt, size_t). Einige Referenzen:

Ссылка

Ссылка

Magic-Nummer in boost :: hash_combine

Ich möchte untersuchen, wie man eine 64-Bit-Version von hash_combine erstellt.

Die erste Sache ist, goldenes Verhältnis oder irgendeine andere irrationale Zahl in 64 Bit zu erhalten.

Der zweite Teil besteht darin, Schichten zu verwenden. Dieser Teil ist eher knifflig, und ich würde gerne fragen, ob es Best Practices oder eine Anleitung zur Verwendung von Shifts gibt, um Hashwerte zu erhalten. Oder wählen Sie Verschiebungen wie der ursprüngliche Code:

%Vor%

ist völlig zufällig?

Wie kann man auch die Ausgabe von hash_combine auswerten, um sicherzustellen, dass es nicht mehr Kollisionen erzeugt als die ursprüngliche Hash-Funktion hash_value ?

    
Viet 15.12.2011, 01:11
quelle

2 Antworten

3

Wenn Sie nur einen hash_combine haben möchten, der 2 64-Bit-Werte in einen hashed, und Sie keine neue Hash-Funktion für Strings benötigen, könnten Sie einfach ein kleines bisschen Code von CityHash abrufen, vorausgesetzt, size_t ist eine 64-Bit-Ganzzahl ohne Vorzeichen, fügen Sie Ihr Lieblings-Preprozessor- oder Template-Trickery hinzu, um dies zu überprüfen):

%Vor%

(Ich denke, dieses Snippet hier und anderswo zu reproduzieren ist in Ordnung, weil es keinen "wesentlichen Teil" des CityHash-Codes darstellt, aber überprüfen Sie bitte die CityHash Quellen- und Lizenzvereinbarung, um selbst zu entscheiden)

    
Scott Howlett 24.01.2012 00:25
quelle
2

Lesen Sie Ссылка , um einige grundlegende Informationen zum Design von Hash-Funktionen und den anderen Artikeln in Ссылка für detailliertere Informationen. CityHash wurde mithilfe von getestet Ссылка , und Sie können Ihre hash_combine wahrscheinlich mit derselben Testsuite testen.

Obwohl ich kein Experte für Hashing bin, lassen mich die Designs der letzten Hash-Funktionen glauben, dass der 2-Schicht-Technik-Boost% co- de% nicht mehr dem Stand der Technik entspricht und verbessert werden kann.

    
Jeffrey Yasskin 28.12.2011 20:54
quelle

Tags und Links