Ich schreibe gerade ein Programm, das vier vorzeichenlose 32-Bit-Ganzzahlen als Ausgabe von einer bestimmten Funktion erzeugt. Ich möchte diese vier Ganzzahlen hashen, damit ich die Ausgabe dieser Funktion mit zukünftigen Ausgaben vergleichen kann.Hash-Funktion für vier vorzeichenlose Ganzzahlen (C++)
Ich habe Probleme beim Schreiben einer anständigen Hashing-Funktion. Als ich diesen Code ursprünglich schrieb, warf ich eine einfache Addition der vier ganzen Zahlen ein, von denen ich wusste, dass sie nicht ausreichen würden. Ich habe einige andere Techniken ausprobiert, wie Verschieben und Hinzufügen, ohne Erfolg. Ich bekomme einen Hash, aber es ist von schlechter Qualität und die Funktion erzeugt eine Menge Kollisionen.
Der Hash-Ausgang kann entweder eine 32-Bit- oder eine 64-Bit-Ganzzahl sein. Die fragliche Funktion erzeugt viele Milliarden Hashes, daher sind Kollisionen ein echtes Problem, und ich bin bereit, eine größere Variable zu verwenden, um sicherzustellen, dass möglichst wenige Kollisionen auftreten.
Kann mir jemand helfen, herauszufinden, wie man eine Qualitäts-Hash-Funktion schreibt?
"Ich möchte diese vier Ganzzahlen hashen, damit ich die Ausgabe dieser Funktion mit zukünftigen Ausgaben vergleichen kann." Folgt nicht unbedingt. Wenn Sie eine Funktion testen, die Strings ausgibt, müssen Sie nicht auf 32 oder 64 Bits hashen, um Regressionstests durchzuführen. In deinem Fall gibst du dir Kopfschmerzen, um 50% Speicherplatz zu sparen (vorausgesetzt, du verwendest 64 statt 128 Bits). Ist es das wert? Hast du es mit gzip versucht? –
Haben Sie in Erwägung gezogen, eine oder mehrere der folgenden allgemeinen Hashfunktionen zu verwenden: http://www.partow.net/programming/hashfunctions/index.html –