【发布时间】:2013-03-19 03:05:27
【问题描述】:
我正在通过 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);
或者,如果我从实现中删除上述代码,让我重新提出我的问题,有什么缺点?我了解它如何避免碰撞的机会,但不确定“确切”如何?
有人可以通过举个例子帮助我理解,并解释使用和不使用上述代码将如何工作吗?
【问题讨论】:
-
评论的哪一部分你不明白?
-
如何使用">>>" 运算符来避免冲突,即使键返回相同的值? 7和4的意义是什么?使用 13 和 7 或其他整数而不是 7 和 4 更好吗??
-
@Lav:常数是通过实验确定的;对他们没有真正的意义。 (实际上,对于散列,使用没有真实模式的临时数字通常是一个好 的想法)。但问题不在于两个键具有完全相同的哈希码,而是当两个键具有相同的哈希码 mod 2 的小幂时减少冲突。
-
好的,我感觉更好了,可能是一个具体的例子可以帮助更好?
-
它确保在每个位位置仅相差恒定倍数的 hashCode 具有有限数量的冲突。 (在默认负载因子下约为 8)
标签: java collections hash hashmap