我正在阅读Java 1.6 API提供的HashMap类代码,但无法完全理解以下操作的必要性(在put和get方法的主体中找到):
int hash = hash(key.hashCode());
hash()
方法的实现如下:
private static int hash(int h) {
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
这实际上通过在提供的哈希码上执行位运算来重新计算哈希。尽管API如下所述,但我无法理解为什么需要这样做:
这很关键,因为HashMap使用长度为2的幂的哈希表,否则会遇到在较低位中没有差异的哈希码之间发生冲突的情况。
我确实理解键值对存储在数据结构数组中,并且该数组中的项目的索引位置由其哈希确定。但我不明白这个函数如何为哈希分布增添任何价值。
hash(int h)
看作是用于均匀分布的二级哈希吗? - roottraveller