我正在使用Java的HashMap hash()实现,如下所示
final int hash(Object k) {
// some checks
h ^= k.hashCode();
// 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);
// >>> is Unsigned right shift
}
我不确定为什么添加以下代码,以及获得的优势是什么?
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
或者让我重新构建我的问题,如果我从实现中删除上面的代码有什么缺点?我理解一些如何避免碰撞的机会,但不确定“确切”如何?
有些人可以通过举例来帮助我理解,并解释如何使用和不使用上述代码吗?
答案 0 :(得分:4)
Java哈希表实现将表大小调整为不是大小,而是大小为2。这允许它使用快速位掩码而不是昂贵的余数操作,这通常是一件好事,但缺点是特别糟糕的散列函数可能比平常有更多的冲突。您引用的代码以最小化额外冲突的方式混合哈希的位。