2012-08-05 83 views
-9

我所經歷的HashMap和閱讀下面的分析碰撞..關於在地圖

  1. 一個HashMap的實例有兩個影響其性能的參數:初始容量和負載因子。

  2. 容量是哈希表中桶的數量,初始容量就是哈希表創建時的容量。

  3. 加載因子是衡量哈希表在其容量自動增加之前是否允許獲得的滿量程。

  4. 當哈希表中的條目數超過了負載因子和當前容量的乘積時,哈希表會被重新哈希(即重建內部數據結構),以便哈希表大約是桶的數量。

  5. 默認初始容量爲16,默認加載因子爲0.75。您可以在地圖的構造函數中提供其他值。

現在假設我有一個地圖..

HashMap map=new HashMap();//HashMap key random order. 
     System.out.println("Amit".hashCode()); 
     map.put("Amit","Java"); 
     map.put("mAit","J2EE"); 
     map.put("Saral","J2rrrEE"); 

我想碰撞的發生,請告知如何會發生碰撞.. !!

+2

對不起,我不明白這一點,「請告知如何發生碰撞」 - 爲什麼你需要碰撞必然發生? – Arpssss 2012-08-05 05:34:12

+2

「我想要發生碰撞」。爲什麼?這正是你應該試圖*避免*。 – EJP 2012-08-05 09:55:51

回答

2

我相信確切的hashmap行爲是依賴於實現的。只要看看你的類庫是否正在做散列並構造一個碰撞。這很簡單。

如果你想在任意對象而不是字符串上發生衝突,那就容易多了。只需創建一個總是爲returns 0的定製hashCode()

0

當2個鍵具有相同的散列鍵時碰撞將發生。 我沒有計算你的密鑰哈希鍵,但我不認爲他們有相同的哈希鍵,所以如果他們沒有相同的哈希鍵,碰撞不會發生。 如果你會把相同的字符串作爲密鑰比你碰撞

1

如果你想真正發生碰撞,那最好是編寫自己的自定義哈希碼。舉例來說,如果你想碰撞AmitmAit,你可以做一件事,只需要添加字符的ascii值作爲哈希碼。你會碰到不同的鑰匙。

+0

所以我會寫我自己的重寫hashcode()方法,並將返回所有..相同的hashcode()。 – DON 2012-08-05 06:01:08

0

這裏的衝突絕對是可能的,而不是綁定到哈希表實現。 HashMap通過使用Object.hashCode將對象映射到存儲桶,然後使用Object.equals使用衝突解決機制(OpenJDK實現使用單獨鏈接)在內部工作。

要回答你的問題,兼容性String.hashCode被明確定義...

返回的哈希碼此字符串。用於String對象的哈希代碼是使用int算術,其中s[i]是字符串的個字符計算爲 s[0]*31^(n-1) + s[1]*31^(n-2) + ... + s[n-1]

n是串的長度,及表示^求冪。 (空字符串的哈希值是零。)

或者,在碼(從OpenJDK

public int hashCode() { 
    int h = hash; 
    if (h == 0 && count > 0) { 
     int off = offset; 
     char val[] = value; 
     int len = count; 

     for (int i = 0; i < len; i++) { 
      h = 31*h + val[off++]; 
     } 
     hash = h; 
    } 
    return h; 
} 

正如任何散列函數,碰撞是可能的。根據Wikipedia article,它指出,例如,"FB""Ea"導致相同的值。

如果你想要更多,在這裏找到具有相同散列值的衝突應該是一個微不足道的問題。


作爲一個方面說明,我以爲我會指出,這是怎麼非常類似的功能在第二版C編程語言

#define HASHSIZE 100 

unsigned hash(char *s) 
{ 
    unsigned hashval; 

    for(hashval = 0; *s != '\0'; s++) 
     hashval = *s + 31 * hashval; 

    return hashval % HASHSIZE; 
}