Sky*_*ker 2 java hash bit-manipulation hashtable data-structures
我注意到哈希函数代码作为其中的一部分java.util.Hashtable#get(K key)
执行以下操作:int index = (hash & 0x7FFFFFFF) % tab.length;
.这个二进制'和'操作只是为了重置符号位吗?因此避免负表访问.
更新:他们'和'与0x7FFFFFFF而不是0xEFFFFFFF的事实让我感到困惑.为什么符号需要一个完整的字节而不是一个比特?
对,那是正确的.这是为了避免对哈希表中的底层数组进行负索引.
请注意,在使用无符号整数类型(如C或C++)的语言中,只需在哈希函数中使用无符号值即可避免这种情况.
编辑:鉴于你的新问题为什么0x7FFFFFF
对0xEFFFFFF
- 这些数字中的第一个是全部1,顶部位设置为0.其中第二个没有这个属性; 它出来到1110
后面大量1S的.因此,使用第一个屏蔽将清除1位,而使用第二个屏蔽可能不会执行此操作.
希望这可以帮助!