为什么容量必须是倍数或2? 为何使用“&”在indexFor函数中? 为什么要重新计算散列函数中的散列而不是直接使用密钥的散列码?
我认为这个实现与“算法简介”的描述有一些重要的区别。
“>>>”是什么意思?
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);
}
有人能给我一些指导吗?我很欣赏如果有人可以解释哈希算法。 非常感谢!
答案 0 :(得分:5)
这是性能优化。将哈希代码映射到表索引的常用方法是
table_index = hash_code % table_length;
%
运算符很贵。如果table_length
是2的幂,则计算:
table_index = hash_code & (table_length - 1);
相当于(更多)更昂贵的模运算。
答案 1 :(得分:0)
不要理会幕后的男人。
实际算法无疑是开发人员“感觉良好”的组合,修复了一些奇怪的退化案例,以及简单的传统(用户经常会产生模糊的依赖)。
请注意:
* Applies a supplemental hash function to a given hashCode, which * defends against poor quality hash functions. This is critical * because HashMap uses power-of-two length hash tables, that * otherwise encounter collisions for hashCodes that do not differ * in lower bits. Note: Null keys always map to hash 0, thus index 0.
网:只要它有效且性能良好,你就不在乎了。