効果的なJavaで記述された優れたhashCode()を作成するためのガイドラインでは、フィールドが長い場合、作成者は次の手順について言及しています。
フィールドが長い場合は、(int)(f ^(f >>> 32))を計算します。
なぜこれが行われるのかわかりません。なぜこれを行うのですか?
効果的なJavaで記述された優れたhashCode()を作成するためのガイドラインでは、フィールドが長い場合、作成者は次の手順について言及しています。
フィールドが長い場合は、(int)(f ^(f >>> 32))を計算します。
なぜこれが行われるのかわかりません。なぜこれを行うのですか?
Javaでは、along
は64ビット、anint
は32ビットです。
したがって、これは単純に上位32ビットを取得し、下位32ビットとビット単位でXORします。
hasCodeは32ビット整数値で長い64ビットだからです。longごとに同じ下位32ビットの値で異なるhashCodeが必要であり、この関数はそれを保証する必要があります。
明確にするために、64ビット値を32ビット値にハッシュしています。また、優れたハッシュ関数は、値の均等な分布を生成します(うまくいけば明らかな理由で!)。
半分のビットを無視することもできますが、そうすると、可能な値の半分が1つのシングルを生成することになります。したがって、ハッシュコードを生成するときに、何らかの方法ですべてのビットを考慮に入れる必要があります。
ビットを一緒にマッシュするためのオプションは、AND、OR、XORです。あなたがそれについて考えるならば、ANDとORは値の均等な分布をまったく生み出さないでしょう。XORはそうするので、それが唯一の良い選択です。
hashCodeは、長くないintを返します。優れたhashCodeアルゴリズムは、入力ごとに異なる値を設定しようとします。