Was ist eine sinnvolle Primzahl für die Hashcode-Berechnung?

Eclipse 3.5 verfügt über eine sehr schöne Funktion zum Generieren von Java-hashCode () -Funktionen. Es würde zum Beispiel erzeugen (etwas verkürzt :)

class HashTest {
    int i;
    int j;        
    public int hashCode() {
        final int prime = 31;
        int result = prime + i;
        result = prime * result + j;
        return result;
    }
}

(Wenn Sie mehr Attribute in der Klasse haben,result = prime * result + attribute.hashCode(); wird für jedes weitere Attribut wiederholt. Für ints kann .hashCode () weggelassen werden.)

Dies scheint in Ordnung, aber für die Wahl 31 für die Primzahl. Es stammt wahrscheinlich aus demhashCode Implementierung von Java String, der aus Performancegründen eingesetzt wurde, die lange nach der Einführung von Hardware-Multiplikatoren vergangen sind. Hier haben Sie viele Hashcode-Kollisionen für kleine Werte von i und j: Zum Beispiel haben (0,0) und (-1,31) den gleichen Wert. Ich halte das für eine schlechte Sache (TM), da kleine Werte häufig vorkommen. Für String.hashCode finden Sie auch viele kurze Zeichenfolgen mit demselben Hashcode, z. B. "Ca" und "DB". Wenn Sie eine große Primzahl nehmen, verschwindet dieses Problem, wenn Sie die richtige Primzahl wählen.

Also meine Frage: Was ist eine gute Primzahl zu wählen? Welche Kriterien wenden Sie an, um es zu finden?

Dies ist als allgemeine Frage gedacht - daher möchte ich keinen Bereich für i und j angeben. Aber ich nehme an, dass in den meisten Anwendungen relativ kleine Werte häufiger auftreten als große Werte. (Wenn Sie große Werte haben, ist die Wahl der Primzahl wahrscheinlich unwichtig.) Es macht vielleicht keinen großen Unterschied, aber eine bessere Wahl ist eine einfache und offensichtliche Möglichkeit, dies zu verbessern - warum also nicht? Commons langHashCodeBuilder schlägt auch merkwürdig kleine Werte vor.

(Klärung: das istnicht ein Duplikat vonWarum verwendet Javas hashCode () in String 31 als Multiplikator? da meine frage sich nicht mit der geschichte der 31 im jdk befasst, sondern mit was wäre ein besserer wert in neuem code mit der gleichen grundvorlage. Keine der Antworten dort versucht das zu beantworten.)

Antworten auf die Frage(6)

Ihre Antwort auf die Frage