2012-05-23 43 views
1

我正在考慮爲給定的對象實現我自己的自定義哈希碼......並將其用作我的詞典的key。由於有可能(有可能)2個對象具有相同的哈希碼,我應該重寫哪些額外的運算符,以及應該重寫的是什麼(概念上)?自定義的GetHashcode實現會導致Dictionary或Hashtable的「桶」問題

myDictionary.Add(myObj.GetHashCode(),myObj); 

VS

myDictionary.Add(myObj,myObj); 

換句話說,是否一個字典使用以下的組合,以確定唯一性和剷鬥將對象放置在?

哪一個比別人更重要?

  • 的hashCode
  • 的Equals
  • ==
  • 的CompareTo()

是的compareTo只需要在SortedDictionary?

回答

1

這不是導致問題的桶 - 一旦你確定了使用哈希碼的桶,它實際上找到了正確的對象實例。由於存儲桶中的所有對象共享相同的散列碼,因此使用對象相等(Equals)來查找正確的對象。規則是如果兩個對象被認爲是相等的,它們應該產生相同的散列碼 - 但是產生相同散列碼的兩個對象可能不相等。

2

什麼是GetHashCode用於?

它在設計上有用的只有一件事:把對象放在散列表中。由此得名。

GetHashCode被設計爲只做一件事:平衡散列表。不要用它來做其他事情。特別是:

  • 它沒有提供一個對象的唯一鍵;碰撞概率非常高。
  • 它不具有加密強度,因此不要將其用作數字簽名或等同密碼的一部分
  • 它不一定具有校驗和所需的錯誤檢測屬性。

等等。

埃裏克利珀

http://ericlippert.com/2011/02/28/guidelines-and-rules-for-gethashcode/