c#:相同的对象必须有相同的HashCode

本文关键字:HashCode 对象 | 更新日期: 2023-09-27 18:04:13

假设我有两个对象分别叫KM

if(K.Equals(M))
{
}

如果这是真的,KM 总是具有相同的HashCode ?

c#:相同的对象必须有相同的HashCode

GetHashCode()的合约要求它,但由于任何人都可以自己实现它,因此无法保证它。

许多类(尤其是哈希表)需要它来正确运行。

如果你正在实现一个类,你应该始终确保两个相等的对象具有相同的哈希码。

如果你正在实现一个实用程序方法/类,你可以假设两个相等的对象有相同的哈希码(如果不是,是另一个类,而不是你的,有问题)。

如果您正在实现具有安全含义的内容,则不能假定它。

如果这是真的,K和M总是有相同的HashCode ?

是的。

或者更确切地说应该是。哈希码的消费者(例如:容器)可以假设相等的对象具有相等的哈希码,或者更确切地说,不相等的哈希码意味着对象不相等。(不相等的对象可以有相同的哈希码:有更多可能的对象比哈希码,所以这必须被允许。)

还是It depends on the programming language ?

没有

如果这是真的,K和M总是有相同的HashCode ?

是的。除非它们有一个被恶意重写的Equals方法。但这会被认为是坏的。

但请注意,反过来是不正确的,
如果K和M有相同的HashCode则仍然可能是K.Equals(M) == false

是的,它应该返回相同的哈希码。

我想说它是语言独立的。但是不能保证其他程序已经正确地实现了。

GetHashCode返回一个基于当前实例的值适用于散列算法和散列等数据结构表格两个类型相同且相等的对象必须返回相同的哈希码,以确保实例System.Collections.HashTable和System.Collections.Generic.Dictionary工作正常

在应用程序中,哈希码必须唯一地标识对象的实例。这是。net平台的一部分,因此,无论您使用哪种。net语言进行创作,hashcode值都应该有效。

GetHashCode()可以为不同的对象返回相同的哈希值。如果GetHashCode()返回相同的值,你应该使用Equals()来比较对象,而不是GetHashCode(),——Equals()的实现应该考虑另一个对象相等性检查。

哈希数据结构能够通过使用冲突解析算法处理这种情况。

从维基百科:

在散列随机数据时,哈希冲突实际上是不可避免的一个可能的键的大集合的子集。例如,如果2500个键是散列到一百万个桶中,即使是完全均匀随机的分布,根据生日问题有95%的可能性至少有两个键被散列到同一个槽

因此,大多数哈希表实现都存在一些冲突处理此类事件的解决策略。一些常见的策略是下面描述。所有这些方法都要求键(或指针)

这取决于对象的Equals实现。它可能在引擎盖下使用GetHashCode,但它没有太多。如果你有一个自定义Equals实现的对象HashCode可能会不同