12

編集: この質問はビット単位の演算子に関するものではなく、Java hashCode() で XOR がよく使用されるのに、別のビット単位の演算子がほとんど使用されないのはなぜですか?

オブジェクトのハッシュ計算のさまざまなアプローチを見てきました。

class A {
  public B b;
  public C c;

  @Override
  public boolean equals();
  @Override
  public int hashCode() {
   return c.hashCode() ^ b.hashCode(); //XOR
   return c.hashCode() + prime * b.hashCode(); // SUM
   return Objects.hash(b,c); // LIB
  }
}

LIB 法は SUM を使用しているようですが、なぜ XOR より優れているのでしょうか?

例はJavaにありますが、この質問は数学と確率に関するものです。

4

3 に答える 3

5

SUM は、ハッシュ コードのすべてのビットを使用してハッシュ (この場合は int の 32 ビット) を分散することを保証し、そのための sub hashcode() 実装に関する仮定を行いません。

XOR は、B と C のハッシュコードに同じプロパティがある場合にのみ同じプロパティを持ちます。そうでない場合、B と C のハッシュコードの「有用な」ビット数の最小値のみを使用するため、分散が悪化し、衝突が頻繁に発生する可能性があります。 . B と C が非常に小さい傾向がある整数である場合、問題を確認するのは非常に簡単です。最初の数ビットしか使用しません (int.hashcode() は恒等関数であるため)。

于 2013-06-25T12:24:08.370 に答える
0

これは、sumprovides が よりも優れた配布を提供するためxorです。

たとえば、int abの値が 0 ~ 7 (バイナリ) の場合、これら 2 つの引数の結果000は常に 0 ~ 7 になります (変更されるのは 3 ビットのみです)。乗算と aを実行すると、値が 0 と 7 の範囲内にないため、分布が大幅に改善されます。111xorxorsum

于 2013-06-25T12:19:44.063 に答える