2013-11-28 30 views
4

我在读的是关于HashMap如何工作的事实java。我发现hash方法中的代码在HashMap类中hashcodeShift right zero fill operator的一个操作数。其他operands就像127420。后来一些处理的结果进行。我的问题是,为什么只有这四个数chossen用于计算可实际用于计算在桶中的位置哈希函数值为什么数字像4,20,12,7用在散列函数中'HashMap Class`

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); 
} 
+1

请参阅[这个问题](http://stackoverflow.com/questions/9335169/understanding-strange-java-hash-function) –

回答

3

这并不是说“只有这些四个数字被选择用于计算散列函数中的值“,关键对象的hashCode方法返回的散列码是(非常重要的)输入。 HashMap实现中的这种方法只是试图改进这一点,因为有关HashMap之后将如何使用该值的知识。

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

Integer作为键的实例为例:它们的哈希码与它们的值相同,因为这将散列整个2³²范围内的哈希码。但是,如果将值0xa0000000,0xb0000000,0xc0000000,0xd0000000放入映射中,则仅使用较低位的映射将具有较差的结果。这种改进解决了这个问题。

为这个位操作选择的数字,以及一般的算法是一个连续调查的领域。随着开发的不断发展,您将看到JVM实现之间的变化。

相关问题