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)

建议使用第二种方法(Effective Java 中的 Joshua bloch)。这背后的原因是什么?我在下面产生了我的想法,请提供您的意见,无论我的断言是否正确?

如果你有其他东西,你可以添加它。谢谢。

4

2 回答 2

1

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

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

l ^ (l>>>32) :: 将高 32 位异或到低 32 位,这比第一种方法仅采用低 32 位为您提供更多选择整体位的分布。

于 2013-09-14T09:56:12.737 回答
-1

实际上,我不认为在所有情况下都建议这样做。如果我必须在这两者之间做出选择,我会选择第一个(不过,你最好使用完全不同的东西)当多头既是积极的又是消极的时。这是因为如果你使用L ^ (L>>>32), 并且你有 long 值 -1 和 0,或者是n和的任何组合-(n+1)(至少 where n<2^32),由于两者的补码编码,散列将产生相同的值。n我猜与和配对n+2^32不太常见。

于 2013-09-14T10:05:10.183 回答