2013-11-28 57 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實現之間的變化。

相關問題