1. ホーム
  2. java

[解決済み] なぜhashCodeに素数を使うのですか?

2022-04-13 05:42:27

質問

なぜ、素数がクラスの hashCode() メソッドを使用することができますか?例えば、Eclipseを使って私の hashCode() メソッドには、常に素数 31 を使用します。

public int hashCode() {
     final int prime = 31;
     //...
}

参考文献

Hashcodeの良い入門書と、私が見つけたハッシュの仕組みに関する記事です(C#ですが、コンセプトは移植可能です)。 Eric LippertのGetHashCode()のガイドラインとルール

どのように解決するのですか?

掛け合わせる数と入れるバケツの数が直交する素因数分解にしたいからです。

挿入するバケツが8つあるとします。掛け算に使う数字が8の倍数の場合、入れるバケツは最下位(全く掛け算されない方)の項目だけで決まります。似たようなエントリーは衝突してしまいます。ハッシュ関数には向いていません。

31 は十分に大きな素数なので、バケット数がそれで割り切れることはまずありません(実際、最近の java HashMap 実装ではバケット数を 2 のべき乗に抑えています)。