有效Java hashCode()实现中的位移

我想知道是否有人可以详细解释什么

(int)(l ^ (l >>> 32));

在下面的hashcode实现中(由eclipse生成,但与Effective Java相同):

 private int i; private char c; private boolean b; private short s; private long l; private double d; private float f; @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + i; result = prime * result + s; result = prime * result + (b ? 1231 : 1237); result = prime * result + c; long t = Double.doubleToLongBits(d); result = prime * result + (int) (t ^ (t >>> 32)); result = prime * result + Float.floatToIntBits(f); result = prime * result + (int) (l ^ (l >>> 32)); return result; } 

谢谢!

基本上,它将底部32位的长32位进行异或。 这是一个爆炸版本:

 // Unsigned shift by 32 bits, so top 32 bits of topBits will be 0, // bottom 32 bits of topBits will be the top 32 bits of l long topBits = l >>> 32; // XOR topBits with l; the top 32 bits will effectively be left // alone, but that doesn't matter because of the next step. The // bottom 32 bits will be the XOR of the top and bottom 32 bits of l long xor = l ^ topBits; // Convert the long to an int - this basically ditches the top 32 bits int hash = (int) xor; 

回答你的评论:你有一个long值,必须转换成一个int作为哈希的一部分(结果必须只有32位)。 你打算怎么做? 您可以采用最低32位 – 但这意味着只会忽略前32位的更改,这不会使它成为一个非常好的哈希。 这样,单个输入位的改变总是导致散列的单个位的改变。 不可否认,您仍然可以轻松地获得冲突 – 例如,更改位7和39,或者将任何其他位对32位置分开 – 但是必然会出现这种情况,因为您将从2 64个可能的值变为2 32

它需要一个64位的数字,将它分成两半,然后将这两半分开(基本上)。

它需要一个(64位) long l ,独占或者是上半部分和下半部分(每个32位)到64位结果的底部32位,然后只用底部32位和(int)强制转换。