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
?
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)
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.