2

我注意到作为一部分的哈希函数代码java.util.Hashtable#get(K key)执行以下操作int index = (hash & 0x7FFFFFFF) % tab.length;:这个二进制“与”操作是否仅用于重置符号位?因此避免负面的表访问。

更新:他们使用 0x7FFFFFFF 而不是 0xEFFFFFFF 的事实让我感到困惑。为什么符号需要一个完整的字节而不是一个位?

4

2 回答 2

5

对,那是正确的。这是为了避免对哈希表中的底层数组进行负索引。

请注意,在 C 或 C++ 等具有无符号整数类型的语言中,只需在哈希函数中使用无符号值即可避免这种情况。

编辑:考虑到你关于为什么0x7FFFFFFvs的新问题0xEFFFFFF- 这些数字中的第一个全是 1,最高位设置为 0。其中第二个没有这个属性;结果是1110很多 1。因此,使用第一个屏蔽将清除 1 位,而使用第二个屏蔽可能不会这样做。

希望这可以帮助!

于 2013-01-20T19:28:04.283 回答
3

他们使用 0x7FFFFFFF 而不是 0xEFFFFFFF 的事实让我感到困惑。为什么符号需要一个完整的字节而不是一个位?

0x7FFFFFFF 只是最高位。在二进制中,它是 01111111111111111111111111111111。而 0xEFFFFFFF 是 11101111111111111111111111111111,所以它会屏蔽不同的位。

于 2013-01-20T21:28:18.410 回答