Boolean.hashCode() 質問する

Boolean.hashCode() 質問する

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

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

なぜ 1231 と 1237 が使用されるのでしょうか? 他のものを使用しないのはなぜですか?

ベストアンサー1

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

なぜ素数なのか?
仮に1000と2000のような合成数(素数ではない)を選んだとします。ブール値をハッシュテーブルに挿入すると、真実そして間違い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 が指摘しているように、複合オブジェクトのハッシュ関数を作成する一般的な方法は、サブコンポーネントのハッシュ コード実装を再利用することであり、その場合は大きな素数を返すのが適切です。

関連する質問:

おすすめ記事