2012-06-20 31 views
3

這是Java HashTable Class的hashCode()實現。如果散列表中元素的數量很大,散列碼超過INTEGER MAX LIMIT -2,147,483,648至2,147,483,647,該怎麼辦?我假設hashCodes將是正整數。如果計算的散列碼超過INTEGER MAX LIMIT,會發生什麼情況?

public synchronized int hashCode() { 

    int h = 0; 
    if (count == 0 || loadFactor < 0) 
     return h; // Returns zero 

    loadFactor = -loadFactor; // Mark hashCode computation in progress 
    Entry[] tab = table; 
    for (int i = 0; i < tab.length; i++) 
     for (Entry e = tab[i]; e != null; e = e.next) 
      h += e.key.hashCode()^e.value.hashCode(); 
    loadFactor = -loadFactor; // Mark hashCode computation complete 

    return h; 
} 
+2

高於int類型限制(32位)的位將被丟棄。 – nhahtdh

+0

「如果散列表中元素的數量很大」呢?它是什麼 - 哈希表必須處理碰撞。沒有要求,也不保證哈希碼是唯一的(事實上,不可能有這樣的保證) –

+3

'的System.out.println(「是否散列碼總是積極?」的hashCode());''打印-835520151';) –

回答

11

我認爲哈希碼將是正整數。

不,不一定。他們只是整數。它們肯定是負面的,在計算散列碼時可以有整數溢出。一個理想的散列碼將在整個範圍內均勻分佈(在這種情況下爲int)。任何使用一個哈希碼肯定需要考慮到值爲負值的可能性。

+0

如果我知道我的hashCode在一個特定的小範圍內,有沒有一種方法可以告訴HashMap只爲這個範圍創建桶?這應該是更高效,爲所有人創造2^32號 – banarun

+0

@banarun桶:沒有,但斗的不僅僅是反正在尋找範圍內挑選,據我所知。除非你有具體的證據證明這是造成問題的原因,否則我不會擔心。 –

+0

例如,如果HashMap容量大於(或等於)hashCode範圍,則從hashCode到bucket的一對一映射將是最有效的。但是,這不會是如果HashMap的bucketizes整個整數範圍 – banarun

0

有時得到的整數溢出可能不適合您的需求。我有時會這樣說。我還沒有遇到這種情況,但我想阻止它。

我會貼上你,我用它來生成一個散列碼的代碼。我通常通過從一個對象中獲取所有的變量並將它們轉換爲字符串並進行計算。

public static int generateHashCode(String ... args) 
{ 
    int length = 0; 
    char[] cArray = null; 
    if(args.length == 1) { 
     length = args[0].length(); 
     cArray = args[0].toCharArray(); 
    } 
    else { 
     for(int i = 0; i < args.length; i++) { 
      length += args[i].length(); 
     } 

     cArray = new char[length]; 
     int incrementer = 0; 
     for(int i = 0; i < args.length; i++) { 
      String str = args[i]; 
      for(int j = 0; j < str.length(); j++) { 
       cArray[incrementer] = str.charAt(j); 
       ++incrementer; 
      } 
     } 
    } 

    int h = 0; 
    for (int i = 0; i < cArray.length; i++) { 
     h = 31*h + cArray[i]; 
    } 

    return h; 
} 
相關問題