我們被告知我們應該爲我們的類實現hashCode(),但像我這樣的大多數人並沒有真正的想法來知道如何做到這一點,或者如果我們弄錯了會發生什麼。例如,我需要一個散列函數來索引樹中的節點(Finding the most frequent subtrees in a collection of (parse) trees)。在這種情況下,我需要基於有序的子節點遞歸地生成哈希碼,例如,對於普通程序員是否有「足夠好」的散列函數?
hashCode = function(child1.hashCode, child2.hashCode, ...)
在散列碼答案的recent discussion包含字符串的哈希(基於長素和31),也bitshifting。字符串散列是:
// adapted from String.hashCode()
public static long hash(String string) {
long h = 1125899906842597L; // prime
int len = string.length();
for (int i = 0; i < len; i++) {
h = 31*h + string.charAt(i);
}
return h;
}
我對安全性不感興趣,不介意碰撞。是否有一種「通用函數」,用於組合有序對象的哈希碼,這些有用對象的做法比有害更好(並且比根本不調用它更好)?
也有一個網站,我們可以查找常見情況?字符串,列表等)
我沒有指定一種語言,因爲我希望有通用的方法。但是,如果它是嚴肅語言特定的,那麼請說明語言以及它爲什麼不通用。
UPDATE兩個建議是使用IDE的hashCode生成器。這似乎是一個很好的默認;這裏的Netbeans:
public int hashCode() {
int hash = 5;
// objects
hash = 97 * hash + (this.rootElement != null ? this.rootElement.hashCode() : 0);
hash = 97 * hash + (this.tableElement != null ? this.tableElement.hashCode() : 0);
// a string
hash = 97 * hash + (this.tag != null ? this.tag.hashCode() : 0);
return hash;
}
這看起來是我想要的。要共享引用:。 「此類使任何類中樹立了良好的hashCode方法它遵循的書有效的Java由約書亞布洛赫所設定的規則寫一個好的hashCode方法實際上是相當困難的這個類的目的是簡化這個過程。「 我懷疑這會讓我成爲一個更好的人(雖然我關心作者的精神權利),但我希望它會讓我更好的程序員... – 2009-11-06 19:59:09
因爲布洛赫的做法是接受什麼,我一直在尋找 – 2009-11-08 12:00:29
不幸的是,這些鏈接現在已經死亡。 :( – Skrylar 2013-05-06 03:06:47