重複の可能性:
Java の hashCode() in String が乗数として 31 を使用するのはなぜですか?
hashCode で素数を使用する理由
有効な Java 項目 9から: equals をオーバーライドするときは、常に hashCode をオーバーライドする オブジェクト クラスで定義された hashcode() をオーバーライドする次の関連コード スニペットを検討してください。
public final class PhoneNumber {
private final short areaCode;
private final short prefix;
private final short lineNumber;
......//Rest ignored on purpose
.....
private volatile int hashCode; // (See Item 71)
@Override public int hashCode() {
int result = hashCode;
if (result == 0) {
result = 17;
result = 31 * result + areaCode;
result = 31 * result + prefix;
result = 31 * result + lineNumber;
hashCode = result;
}
return result;
}
}
ゼロ以外の初期値「17」が選択される理由がわかりました。また、フィールドの順序が計算において重要な役割を果たすように、各ステップで乗算が行われることも理解していhashcode()
ます。しかし、乗算の値として 31 を選択する理由がわかりません。誰かが私に理由を説明できますか? これは Bloch が 31 について言わなければならないことですが、私にはよくわかりません。以下のイタリック体の行を特に理解できません。
奇素数であるため、値 31 が選択されました。偶数で乗算がオーバーフローした場合、2 による乗算はシフトと同等であるため、情報が失われます。素数を使用する利点はあまり明確ではありませんが、伝統的なものです。