Effiziente Implementierung von hashCode () - Java, Algorithmus, Datenstrukturen, Hashmap, Hashcode

Ich erzeuge oft automatisch eine Klasse "s hashCode() Methode mit IntelliJ IDEA und in der Regel hat die Methode das folgende Format:

result = 31 * result + ...

Meine Frage ist, was ist der Zweck der Multiplikation mit 31? Ich weiß, dass dies eine Primzahl ist, aber warum wählen Sie speziell 31? Wenn Sie a hashCode() für einen besonders kleinen / großen Datensatz würden die Menschen dieses Problem anders angehen?

Antworten:

20 für die Antwort № 1

Das Multiplizieren mit 31 ist schnell, weil das JIT es in eine Verschiebung um 5 Bits und eine Subtraktion umwandeln kann:

x * 31 == (x << 5) - x

Ohne besondere Zusatzinformationen würde ich bei diesem Ansatz bleiben. Er ist ziemlich schnell und wird wahrscheinlich mit ziemlich gut verteilten Hash-Codes enden, und es ist auch einfach, richtig zu kommen :)

Die Größe des Datasets ist nicht wirklich wichtig, aber wenn Sie besondere zusätzliche Informationen über die Werte haben, mit denen Sie arbeiten werden (z. B. "es ist immer gerade"), dann Sie kann in der Lage sein, eine bessere Hash-Funktion zu entwickeln. Ich warte, bis es ein Problem ist, aber zuerst :)