1

タイプが long の属性がある場合、オブジェクトのハッシュコードを計算するときに、以下のメソッドでそれを int に変換できます。

 1. int k = (int) (l);
 2. int k = (int)(l^(l>>>32));
( l is an attribute of the object whose datatype is long)

2番目の方法を使用することをお勧めします(Effective JavaのJoshua bloch)。この背後にある理由は何ですか?私が以下に作成した私の考えは、私の主張が正しいかどうかに関係なく、あなたの意見を提供してください?

他に何かあれば追加できます。ありがとう。

4

2 に答える 2

1

下位 32 ビットのみを考慮する第 1 の方法よりも上位 32 ビットと下位 32 ビットを考慮するため、ビットの選択を適切に分散させるため、第 2 の方法を使用することをお勧めします。

l >>> 32 :: は、下位 32 ビットを破棄するか、上位 32 ビットを選択します。

l ^ (l>>>32) :: 上位 32 ビットを下位 32 ビットに XOR することで、最初の方法で下位 32 ビットを取得するよりも、全体のビットを選択するという点でより多くの分散が得られます。

于 2013-09-14T09:56:12.737 に答える
-1

実際、すべての状況でそれが賢明だとは思いません.. もし私がこれら2つのどちらかを選択しなければならないとしたら、ロングが正と負の両方の場合、最初のものを選びます (ただし、完全に異なるものを使用する方がよいでしょう)。これは、 を使用しL ^ (L>>>32)、long 値が -1 と 0 の場合、またはn-(n+1)(少なくとも の場合n<2^32) の任意の組み合わせがある場合、2 つの補数エンコーディングにより、ハッシュは同じ値になるためです。と のペアはあまり一般的nではないと思います。n+2^32

于 2013-09-14T10:05:10.183 に答える