我注意到作为一部分的哈希函数代码java.util.Hashtable#get(K key)
执行以下操作int index = (hash & 0x7FFFFFFF) % tab.length;
:这个二进制“与”操作是否仅用于重置符号位?因此避免负面的表访问。
更新:他们使用 0x7FFFFFFF 而不是 0xEFFFFFFF 的事实让我感到困惑。为什么符号需要一个完整的字节而不是一个位?
我注意到作为一部分的哈希函数代码java.util.Hashtable#get(K key)
执行以下操作int index = (hash & 0x7FFFFFFF) % tab.length;
:这个二进制“与”操作是否仅用于重置符号位?因此避免负面的表访问。
更新:他们使用 0x7FFFFFFF 而不是 0xEFFFFFFF 的事实让我感到困惑。为什么符号需要一个完整的字节而不是一个位?
对,那是正确的。这是为了避免对哈希表中的底层数组进行负索引。
请注意,在 C 或 C++ 等具有无符号整数类型的语言中,只需在哈希函数中使用无符号值即可避免这种情况。
编辑:考虑到你关于为什么0x7FFFFFF
vs的新问题0xEFFFFFF
- 这些数字中的第一个全是 1,最高位设置为 0。其中第二个没有这个属性;结果是1110
很多 1。因此,使用第一个屏蔽将清除 1 位,而使用第二个屏蔽可能不会这样做。
希望这可以帮助!
他们使用 0x7FFFFFFF 而不是 0xEFFFFFFF 的事实让我感到困惑。为什么符号需要一个完整的字节而不是一个位?
0x7FFFFFFF 只是最高位。在二进制中,它是 01111111111111111111111111111111。而 0xEFFFFFFF 是 11101111111111111111111111111111,所以它会屏蔽不同的位。