10 Stimmen

Hashing-Funktion für vier ganze Zahlen ohne Vorzeichen (C++)

Ich schreibe gerade ein Programm, das vier vorzeichenlose 32-Bit-Ganzzahlen als Ausgabe von einer bestimmten Funktion erzeugt. Ich möchte diese vier Ganzzahlen mit einem Hash versehen, damit ich die Ausgabe dieser Funktion mit zukünftigen Ausgaben vergleichen kann.

Ich habe allerdings Schwierigkeiten, eine anständige Hashing-Funktion zu schreiben. Als ich ursprünglich diesen Code schrieb, warf ich in einer einfachen Addition von jeder der vier ganzen Zahlen, die ich wusste, würde nicht ausreichen. Ich habe verschiedene andere Techniken ausprobiert, wie z. B. das Verschieben und Addieren, ohne Erfolg. Ich erhalte einen Hash, aber er ist von schlechter Qualität, und die Funktion erzeugt eine Menge Kollisionen.

Die Hash-Ausgabe kann entweder eine 32-Bit- oder eine 64-Bit-Ganzzahl sein. Die betreffende Funktion generiert viele Milliarden Hashes, so dass Kollisionen hier ein echtes Problem darstellen, und ich bin bereit, eine größere Variable zu verwenden, um sicherzustellen, dass es so wenige Kollisionen wie möglich gibt.

Kann mir jemand helfen, herauszufinden, wie man eine gute Hash-Funktion schreibt?

0voto

Adisak Punkte 6440

Versuchen Sie es mit CRC ou FNV . FNV ist gut, weil es schnell ist und über eine definierte Methode zum Falten von Bits verfügt, um "kleinere" Hash-Werte zu erhalten (d. h. 12-Bit / 24-Bit / usw.).

Auch der Nutzen der Generierung eines 64-Bit-Hashes aus einer 128-Bit-Zahl (4 x 32-Bit) ist etwas fragwürdig, da man, wie bereits von anderen vorgeschlagen, einfach den Originalwert als Schlüssel in einer Menge verwenden könnte. Sie möchten, dass die Anzahl der Bits im Hash die Anzahl der ursprünglichen Werte repräsentiert. Wenn Ihr Datensatz beispielsweise 100.000 4X32-Bit-Werte enthält, benötigen Sie wahrscheinlich einen 17- oder 18-Bit-Hash-Wert und keinen 64-Bit-Hash.

0voto

larsmoa Punkte 12018

Das mag ein bisschen übertrieben sein, aber bedenken Sie Boost.Hash . Erzeugt sehr einfachen Code und gute Werte.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X