在计算hashCode时转换数据类型

时间:2013-09-14 09:48:01

标签: java hash map bit-manipulation hashcode

在计算对象的哈希码时,如果我们有一个类型很长的属性,那么我们可以通过以下方法将它转换为int:

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

建议使用第二种方法(Effective Java中的Joshua bloch)。这背后的原因是什么?我的想法是我在下面制作的,请提供您的输入我的断言是否正确?

如果您有其他内容,可以添加。感谢。

2 个答案:

答案 0 :(得分:1)

建议使用第二种方法,因为它比第一种考虑低32位的方法更好地分配比特选择,因为它考虑高32位和低32位。

  

l >>> 32 ::正在解除低32位或选择更高位    32位。

     

l ^ (l>>>32) :: XORing高32位,低32位    在选择总位数方面为您提供更多分配    而不是仅采用第一种方法的低32位。

答案 1 :(得分:-1)

我实际上并不认为这在任何情况下都是可取的。如果我必须在这两种情况之间做出选择,我会选择第一种(你最好使用完全不同的东西),当多头都是积极的时候和消极的。这是因为如果您使用L ^ (L>>>32),并且您有长值-1和0,或者n-(n+1)的任意组合(至少在n<2^32处) ,由于两个恭维编码,哈希会产生相同的值。我想与nn+2^32配对不太常见。