web-dev-qa-db-ja.com

Boolean.hashCode()

クラスBooleanのhashCode()メソッドは、次のように実装されます。

public int hashCode() {
    return value ? 1231 : 1237;
}

なぜ1231と1237を使用するのですか?なぜ他にないのですか?

113
user471011

1231と1237は2つ(十分に大きい)任意の素数です。他の2つの大きな素数は問題ありません。

なぜ素数なのか?
1秒間、1000と2000などの合成数(非素数)を選択したとします。ブール値をハッシュテーブルに挿入する場合、truefalseは、バケット1000 % N resp 2000 % Nに移動します(Nはバケットの数です)。

今、気づく

  • 1000 % 82000 % 8と同じバケット
  • 1000 % 102000 % 10と同じバケット
  • 1000 % 202000 % 20と同じバケット
  • ....

言い換えれば、多くの衝突につながる

これは、1000(23、53)および2000の因数分解(24、53)非常に多くの共通要因があります。したがって、素数が選択されるのは、それらがバケットサイズに共通の要因をもつ可能性が低いためです。

なぜ素数。 2と3は違いますか?
複合オブジェクトのハッシュコードを計算するときは、コンポーネントのハッシュコードを追加するのが一般的です。多数のバケットを含むハッシュセットで小さすぎる値を使用すると、オブジェクトが不均一に分布するリスクがあります。

衝突は重要ですか?とにかくブール値は2つの異なる値を持っていますか?
マップには、ブール値と他のオブジェクトを含めることができます。また、Drunixが指摘したように、複合オブジェクトのハッシュ関数を作成する一般的な方法は、サブコンポーネントのハッシュコードの実装を再利用することです。この場合、大きな素数を返すのが適切です。

関連する質問:

135
aioobe

上記のすべてに加えて、開発者からの小さなイースターエッグでもあります。

true:1231 => 1 + 2 + 3 + 1 = 7

7-ヨーロッパの伝統における幸運な数です。

false:1237 => 1 + 2 + 3 + 7 = 13

13(別名悪魔のダース)-不運な数字。

0
bvp