2013-04-18 74 views
2

因此,我已經閱讀了幾個與hashcode的實現和使用XOR操作符的建議有關的答案。 (例如,Why are XOR often used in java hashCode() but another bitwise operators are used rarely?)。由Eclipse生成的Hashcode

當我使用Eclipse來生成散列碼功能,其中field是一個對象,timestamp長,輸出的是:

public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result 
     + field == null) ? 0 : field.hashCode()); 
    return result; 
} 

沒有任何理由不使用XOR運算符像下面?

result = prime * result + (int) (timestamp^(timestamp >>> 32)); 
+3

我在這裏看到一個異或'prime * result +(int)(timestamp ^(timestamp >>> 32))'...... –

+0

@Heuster這是他的編輯錯過。其實Eclipse只創建這一行'result = prime * result + field == null)? 0:field.hashCode());' – Jayamohan

回答

3

Eclipse採取安全的方式。雖然使用素數,乘法和加法的計算方法比單個XOR慢,但在有多個字段的情況下,它會爲您提供總體更好的哈希碼。

考慮一個簡單的例子 - 一個類有兩個String s,ab。您可以使用

a.hashCode()^b.hashCode() 

a.hashCode() * 31 + b.hashCode() 

現在考慮兩個對象:

a = "ABC"; b = "XYZ" 

a = "XYZ"; b = "ABC" 

第一種方法會產生他們相同的散列碼,因爲異或是對稱的;第二種方法會產生不同的哈希碼,這是好的,因爲對象不相等。一般而言,您希望不相等的對象儘可能具有不同的哈希碼,以提高這些對象的基於哈希的容器的性能。 31*a+b方法比XOR更好地實現此目標。

注意,當你正在處理的同一對象的多個部分,如在

timestamp^(timestamp >>> 32) 

上述論點是弱得多:遇到兩個時間戳,使得它們之間的唯一區別是,它們的上部和下部交換比兩個交換ab字段值的對象更難想象。

相關問題