自定义GetHashcode实现是否会导致Dictionary或Hashtable的“桶”出现问题

时间:2012-05-23 21:54:48

标签: c# dictionary gethashcode compareto sorteddictionary

我正在考虑为给定对象实现我自己的自定义哈希码...并将其用作我的词典的key。由于(可能)2个对象可能具有相同的哈希码,我应该覆盖哪些额外的运算符,以及覆盖(概念上)应该是什么样的?

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

vs

   myDictionary.Add(myObj,myObj);

换句话说,Dictionary是否使用以下组合来确定唯一性以及放置对象的存储桶?

哪个比其他人更重要?

  • HashCode
  • 等于
  • ==
  • 的CompareTo()

是仅在SortedDictionary中需要compareTo吗?

2 个答案:

答案 0 :(得分:2)

GetHashCode用于什么?

设计只对一件事有用:将对象放在哈希表中。因此这个名字。

GetHashCode只能做一件事:平衡哈希表。不要将它用于其他任何事情。特别是:

  • 它不为对象提供唯一键;碰撞概率极高。
  • 它不具有加密强度,因此请勿将其用作数字签名或密码等效项的一部分
  • 它不一定具有校验和所需的错误检测属性。

等等。

Eric Lippert

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

答案 1 :(得分:1)

不是导致问题的存储桶 - 一旦您使用哈希码确定存储桶,它实际上是找到正确的对象实例。由于存储桶中的所有对象共享相同的哈希码,因此使用对象相等性(Equals)来找到正确的哈希码。规则是如果两个对象被认为是相等的,它们应该产生相同的哈希码 - 但是产生相同哈希码的两个对象可能不相等。