GetHashCode()
方法的契约要求使用它,但由于任何人都可以制作自己的实现,因此无法保证其可靠性。
许多类(尤其是哈希表)需要它以正确地发挥作用。
如果您正在实现一个类,请确保两个相等的对象具有相同的哈希码。
如果您正在实现某个实用程序方法/类,则可以假定两个相等的对象具有相同的哈希码(如果不是这样,则是另一个类而不是您的类出了问题)。
如果您正在实现具有安全影响的东西,则不能这样假设。
K.Equals(M)
但是 GetHashCode()
的值不同,则该类存在缺陷,可能不应该使用。 - Paweł Obrok我认为这与编程语言无关。但是如果其他程序没有正确实现它,就不能保证。
GetHashCode返回一个基于当前实例的值,适用于哈希算法和数据结构,例如哈希表。两个相同类型且相等的对象必须返回相同的哈希码,以确保System.Collections.HashTable和System.Collections.Generic.Dictionary的实例正常工作。
这取决于对象的Equals实现。它可能在幕后使用GetHashCode
,但也可能不会。因此,如果您有一个具有自定义Equals实现的对象,则两个对象的HashCode可能会不同。
GetHashCode()
可能会为不同的对象返回相同的哈希值。在 GetHashCode()
返回相同值的情况下,您应该使用 Equals()
来比较对象,而不是 GetHashCode()
。实现 Equals()
应该考虑另一个对象的相等性检查。
哈希数据结构可以通过使用冲突解决算法来处理这种情况。
来自 wikipedia:
当对大量可能键的随机子集进行哈希时,哈希冲突几乎是不可避免的。例如,如果将 2,500 个键哈希到一百万个桶中,即使具有完美均匀的随机分布,根据生日问题,至少有两个键被哈希到相同的插槽的概率为 95%。
因此,大多数哈希表实现都有一些冲突解决策略来处理这种情况。下面描述了一些常见的策略。所有这些方法都要求将键(或指向它们的指针)与相关值一起存储在表中。