2017-05-04 59 views
2

假設散列表是一個索引爲0到HASHSIZE-1的數組。該函數返回正確範圍內的值,並且不會生成任何運行時錯誤。假設在String中傳入的字符至少有2個字符。爲什麼它是一個糟糕的散列函數?爲什麼給定的散列函數是一個糟糕的散列函數?

public static int hash(String key) { 
    return (key.charAt(0) 
      + key.charAt(1) 
      + key.charAt(key.length()-1) % HASHSIZE; 
} 
+1

看起來會有很多碰撞,這很糟糕。 – Carcigenicate

+1

檢查分配 –

+1

它似乎也忽略了大部分字符串的內容,這是沒用的。 – Carcigenicate

回答

2

散列函數的質量取決於它們在預期的密鑰羣中創建的衝突的數量。當不同的密鑰產生相同的散列碼的可能性較小時,良好的功能會造成情況。

此方法的質量取決於使用的鍵的預期長度。對於長度爲三的密鑰,這是一種完全可以接受的方法,儘管它並不理想,因爲哈希不會根據字母順序進行更改。

對於長度爲10的密鑰,此方法將爲所有密鑰生成衝突,這些衝突始於最後具有相同字母的同一對字母開始。當兩個首字母和最後一個字母組合重複很多時,您將碰到碰撞,使得這個哈希函數不太有用。

+0

此外,該函數不會使用完整的'int'範圍;結果將永遠不會超過196605,所以如果'HASHSIZE'大於此值,表格的上半部分將完全未被使用,而在下半部分有很多可避免的衝突。 – Holger