3

効果的なJavaで記述された優れたhashCode()を作成するためのガイドラインでは、フィールドが長い場合、作成者は次の手順について言及しています。

フィールドが長い場合は、(int)(f ^(f >>> 32))を計算します。

なぜこれが行われるのかわかりません。なぜこれを行うのですか?

4

4 に答える 4

3

Javaでは、alongは64ビット、anintは32ビットです。

したがって、これは単純に上位32ビットを取得し、下位32ビットとビット単位でXORします。

于 2011-11-09T10:49:31.427 に答える
1

hasCodeは32ビット整数値で長い64ビットだからです。longごとに同じ下位32ビットの値で異なるhashCodeが必要であり、この関数はそれを保証する必要があります。

于 2011-11-09T10:53:45.373 に答える
1

明確にするために、64ビット値を32ビット値にハッシュしています。また、優れたハッシュ関数は、値の均等な分布を生成します(うまくいけば明らかな理由で!)。

半分のビットを無視することもできますが、そうすると、可能な値の半分が1つのシングルを生成することになります。したがって、ハッシュコードを生成するときに、何らかの方法ですべてのビットを考慮に入れる必要があります。

ビットを一緒にマッシュするためのオプションは、AND、OR、XORです。あなたがそれについて考えるならば、ANDとORは値の均等な分布をまったく生み出さないでしょう。XORはそうするので、それが唯一の良い選択です。

于 2011-11-09T10:57:53.273 に答える
0

hashCodeは、長くないintを返します。優れたhashCodeアルゴリズムは、入力ごとに異なる値を設定しようとします。

于 2011-11-09T10:57:05.920 に答える