hashCode()
クラスBoolean のメソッドは、次のように実装されています。
public int hashCode() {
return value ? 1231 : 1237;
}
なぜ1231と1237を使用するのですか?なぜ他にないのですか?
hashCode()
クラスBoolean のメソッドは、次のように実装されています。
public int hashCode() {
return value ? 1231 : 1237;
}
なぜ1231と1237を使用するのですか?なぜ他にないのですか?
回答:
1231と1237は、2つ(十分に大きい)の任意の素数です。他の2つの大きな素数は問題ありません。
なぜ素数なのか?
たとえば、1000と2000のように、複合数(素数ではない)を選択したとします。ブール値をハッシュテーブルに挿入すると、trueとfalseがバケット1000 % N
レスポンス2000 % N
(バケットN
数)に入ります。
今気づく
1000 % 8
同じバケツ 2000 % 8
1000 % 10
同じバケツ 2000 % 10
1000 % 20
同じバケツ 2000 % 20
つまり、多くの衝突が発生します。
これは、1000(2 3、5 3)2000の分解(2 4、5 3)非常に多くの共通要素を有しています。したがって、バケットサイズに共通の要素がある可能性は低いため、素数が選択されます。
なぜ大きな素数なのか。2と3はしませんか?
複合オブジェクトのハッシュコードを計算する場合、コンポーネントのハッシュコードを追加するのが一般的です。バケット数が多いハッシュセットで小さすぎる値を使用すると、オブジェクトの分布が不均一になる可能性があります。
衝突は重要ですか?ブールはとにかく2つの異なる値を持っていますか?
マップには、他のオブジェクトと共にブール値を含めることができます。また、Drunixで指摘されているように、複合オブジェクトのハッシュ関数を作成する一般的な方法は、サブコンポーネントのハッシュコード実装を再利用することです。この場合、大きな素数を返すのが適切です。
関連する質問:
2*1231 = 2462
バケットが必要です。このような状況で衝突は問題になりますか?