2013-03-14 59 views
1

我正在尋找緩存其唯一性由該對象內的所有屬性的組合確定的對象。 我的目的是這樣的:如何緩存具有多個屬性的對象

public double A { get; set; } 
    public double B { get; set; } 
    public short C { get; set; } 
    public bool D { get; set; } 
    public double E { get; set; } 
    public double F { get; set; } 
    public double G { get; set; } 
    public double H { get; set; } 
    public double J { get; set; } 
    public double K { get; set; } 
    public double[] L { get; set; } 
    public double[] M { get; set; } 

我可能會覆蓋GetHashCode,並完成類似return A^B^C etc... 不過,我很擔心,我將有很多衝突。

什麼是最好的方式來緩存這樣的對象?

+0

最好的方法是覆蓋GetHashCode並執行類似於A^B^C的操作......如果您測試併發生碰撞,請考慮如何針對您的需求調整公式。不要重新發明輪子 – 2013-03-14 22:22:55

+0

由於您的屬性具有公共設置器,因此不能保證在'.GetHashCode'連續調用之間數據不會發生變化。如果該狀態發生變化,那麼對於任何依賴散列碼的任何內容(例如字典)都會導致完全中斷行爲。 – 2013-03-14 22:33:19

+0

你是對的關心;如果你的屬性傾向於「集羣」,那麼xoring最終可能會清除很多位。 – 2013-03-15 23:14:31

回答

4

您可以使用此GetHashCode

public override int GetHashCode() 
{ 
    int hash = 23; 
    unchecked 
    { 
     hash *= 17 + A.GetHashCode(); 
     hash *= 17 + B.GetHashCode(); 
     hash *= 17 + C.GetHashCode(); 
     // the same applies with the rest of your properties ... 
     // collections must be treated differently: 
     if(L != null) 
     { 
      hash *= 17 + L.Length; 
      foreach(var d in L) 
       hash *= 17 + d.GetHashCode(); 
     } 
     if (M != null) 
     { 
      hash *= 17 + M.Length; 
      foreach (var d in M) 
       hash *= 17 + d.GetHashCode(); 
     }   
    } 
    return hash; 
} 

這會產生不同的散列碼時,不同的屬性具有相同的值。如果我會省略素數乘法器,如果A==AA==B不會產生影響。質數用於減少錯誤碰撞的可能性。

它還將數組及其值+順序考慮在內。

這是該主題的「必讀」:E. Lippert, Guidelines and rules for GetHashCode

+0

17和23的目的是什麼? – TJF 2013-03-14 22:25:27

+0

@ ThomasJ.Frey:看看這個問題的目的是這個問題:http://stackoverflow.com/a/3613382/284240簡而言之:primes可以幫助您避免爲不同的輸入參數獲取相同的散列值。 – 2013-03-14 22:27:20

+1

當不同的屬性具有相同的值時,它們也會生成不同的哈希碼。如果我將省略23乘數,如果'A' =='A'或'A' =='B'不會產生影響。 – 2013-03-14 22:33:21

0

一個簡單的(altough可能不是最佳的)解決方案可能是:

  1. 生成類的字符串表示。如果你只有海灘屬性,你可以做類似string.Format("{0}-{1}-{2}", A, B, C);由於您有數組,因此最好使用StringBuilder並在循環內組合字符串。

  2. 在生成的字符串上調用GetHashCode

+0

我不認爲這會實際上簡單得多,適當地計算哈希碼。特別是如果你爲此創建了一個輔助方法。 – svick 2013-03-16 13:16:56

相關問題