lar*_*mbr 18 java hash hashmap
可能重复:
了解奇怪的Java哈希函数
static int hash(int h) {
// This function ensures that hashCodes that differ only by
// constant multiples at each bit position have a bounded
// number of collisions (approximately 8 at default load factor).
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
Run Code Online (Sandbox Code Playgroud)
我不太了解这种实现的算法原理.我可以参考的任何解释或任何资源?谢谢 !
UPDATE
谢谢大家的答案和资源.实际上我理解哈希是如何工作的,但不是知道这个代码将如何确保a bounded number of collisions,正如评论所说.有理论上的验证吗?
主要目标是为类似的输入参数生成非常不同的值,并最大限度地减少冲突次数. http://en.wikipedia.org/wiki/Hash_function
这种实现只是许多可能功能的一个令人满意的选择.
此功能有助于更好地避免碰撞HashMap.
如果你有很好的hashCode实现,你仍然可以因为你需要hashCode % size检测对象的存储桶而发生冲突.
例:
假设,你的尺寸HashMap就是20.
hashCode()for object1和get 401.斗是401 % 20 = 1.hashCode()for object2和get 3601.斗是3601 % 20 = 1hashCode()for object3和get 1601.斗是1601 % 20 = 1.因此,即使您有三个不同的hashCodes,您也可以为所有三个对象获得一个存储桶,这意味着您的HashMap的复杂性O(n)而不是O(1).
如果我们将函数hash应用于我们得到的所有获得的哈希码
hash = 395, bucket = 395 % 20 = 15hash = 3820, bucket = 3820 % 20 = 0hash = 1577, bucket = 1577 % 20 = 17清楚,hash作为额外步骤应用我们得到三个不同的桶,保持对对象的恒定时间访问.
| 归档时间: |
|
| 查看次数: |
1762 次 |
| 最近记录: |