自定义 GetHashcode 实现是否会导致字典或哈希表的"buckets"出现问题



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

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

   myDictionary.Add(myObj,myObj);

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

哪些比其他更重要?

  • 哈希码
  • 等于
  • ==
  • 比较到()

比较到只在排序词典中需要吗?

GetHashCode 的用途是什么?

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

GetHashCode被设计为只做一件事:平衡哈希表。不要将其用于其他任何事情。特别:

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

等等。

埃里克·利珀特

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

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

最新更新