为什么在"HashMap类"中哈希函数中使用的数字如4,20,12,7

Dee*_*pak 5 java algorithm hashmap map

我正在读到这样一个事实,即.I中的HashMap作品究竟是如何在类java中的hash方法中找到代码 的操作数之一.另外就像是.之后对结果进行了一些处理.我的问题是为什么只有这四个数字才能用于计算哈希函数中实际用于计算桶中位置的值HashMaphashcodeShift right zero fill operatoroperands12 7 4 20

public V put(K key, V value) {
    if (key == null)
        return putForNullKey(value);
    int hash = hash(key.hashCode());
     int i = indexFor(hash, table.length);
     for (Entry<K,V> e = table[i]; e != null; e = e.next) {
         Object k;
         if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
             V oldValue = e.value;
             e.value = value;
             e.recordAccess(this);
             return oldValue;
         }
     }

     modCount++;
     addEntry(hash, key, value, i);
     return null;
}


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)

Hol*_*ger 3

\xe2\x80\x99 并不是只选择 \xe2\x80\x9 这四个数字来计算哈希函数\xe2\x80\x9d 中的值,hashCode关键对象的方法返回的哈希码是(非常重要) ) 输入。HashMap考虑到以后将如何使用该值,该实现中的方法只是尝试改进这一点HashMap

\n\n

典型的实现将仅使用哈希码的低位,因为内表的大小是 2 的幂。因此,改进应确保即使不同密钥的原始哈希码仅在高位上不同,在低位中具有不同值的可能性是相同的。

\n\n

Integer用作键的实例为例:它们的哈希码与其值相同,因为这会将哈希码分布在整个 2\xc2\xb3\xc2\xb2 int 范围内。但是,如果将值0xa00000000xb00000000xc00000000xd0000000放入映射中,则仅使用较低位的映射结果会很差。这项改进解决了这个问题。

\n\n

为这种位操作选择的数字以及一般的算法是一个持续研究的领域。随着开发永无止境,您将看到 JVM 实现之间的变化。

\n