1

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

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

对比

   myDictionary.Add(myObj,myObj);

换句话说,字典是否使用以下组合来确定唯一性以及将对象放置在哪个存储桶中?

哪些比其他更重要?

  • 哈希码
  • 等于
  • ==
  • 相比于()

是否仅在 SortedDictionary 中需要 compareTo?

4

2 回答 2

2

GetHashCode 是做什么用的?

它在设计上只对一件事有用:将对象放入哈希表中。由此得名。

GetHashCode 旨在只做一件事:平衡哈希表。请勿将其用于其他任何用途。尤其是:

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

等等。

埃里克·利珀特

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

于 2012-05-23T21:59:33.607 回答
1

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

于 2012-05-23T21:59:24.257 回答