在计算对象的哈希码时,如果我们有一个类型很长的属性,那么我们可以通过以下方法将它转换为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)。这背后的原因是什么?我的想法是我在下面制作的,请提供您的输入我的断言是否正确?
如果您有其他内容,可以添加。感谢。
答案 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
处) ,由于两个恭维编码,哈希会产生相同的值。我想与n
和n+2^32
配对不太常见。