2011-08-01 35 views
3

假设我有两个对象称为KMC#:相同的对象必须相同的HashCode?

if(K.Equals(M)) 
{ 

} 

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

或者它取决于编程语言?

+2

您的问题已经在您链接到的MSDN上的HashCode文章中得到了解答。 –

+0

欲了解更多信息,请阅读[盗版'代码](http://blogs.msdn.com/b/ericlippert/archive/2011/02/28/guidelines-and-rules-for-gethashcode.aspx)。 –

回答

5

GetHashCode()的合同要求它,但由于任何人都可以自己实施,所以不能保证。

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

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

如果你正在实现一个实用方法/类,你可以假设两个相同的对象具有相同的哈希码(如果没有,它是另一个类,而不是你的,就是越野车)。

如果您正在实施某些具有安全隐患的事情,那么不能承担

+0

如果'K.Equals(M)'但是'GetHashCode()'的值不同,那么这个类就是越野车,并且可能不应该被使用。 –

0

它取决于对象的Equals实现。它可能在引擎盖下使用GetHashCode,但它不会有。所以基本上如果你有一个自定义Equals实现的对象,HashCode对于这两个对象都可能是不同的。

+2

如果是这种情况,该类型违反了GetHashCode的约定。 –

1

Yes, it should return the same hash code.

我想说它是独立于语言的。但没有其他程序正确执行的保证。

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

+0

它不是必须的,但应该。有时不同的对象具有相同的散列,这是一个案例 – sll

+0

必须或应该?对不起,我的英语有时不好...我会编辑我的答案。 但是,不同的对象可能具有相同的哈希码,但equals对象应该不具有不同的哈希码。 – Johnny5

2

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

是的。

或者宁可应该就是这样。散列码(例如容器)的使用者可以假定相同的对象具有相同的散列码,或者不相等的散列码意味着对象不相等。 (不相等的对象可以具有相同的哈希代码:存在比哈希代码更多的可能对象,因此必须允许。)

或者它取决于编程语言?

在应用程序中的散列码具有唯一标识对象的实例没有

0

。这是在.NET平台上,因此,哈希码值应该工作的一部分不管哪个.NET语言,你在创作英寸

+1

哈希码无法保证唯一性。为了窃取和解释Eric Lippert的一行,大约有40亿个可能的散列码结果,有无数个可能的对象,例如字符串。最好的做法是使用散列码来减少群体的数量,但预计不会匹配一个对象。 –

+0

我应该说对象的唯一价值 – Jason

1

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

是的。除非他们有一个邪恶的重写Equals方法。但那会被认为是坏的。

但是注意,反之则不然,
如果K和M有相同的hashCode它仍然是K.Equals(M) == false

+0

所以所有的企鹅都是鸟类,但所有的鸟类都不是企鹅。 –

+0

@Soner:不,那是另一个概念。允许哈希代码碰撞,这不符合集合描述。 –

0

GetHashCode()可以返回相同的散列不同的对象。如果GetHashCode()返回相同的值,则应使用Equals()比较不为GetHashCode(),的对象 - 实施Equals()应考虑另一个对象相等性检查。

散列数据结构能够通过使用冲突解决方案算法来处理这种情况。

wikipedia

哈希冲突散列一大组可能的密钥的随机 子集时,实际上是不可避免的。例如,根据生日问题,如果有2500个密钥被 散列成百万个存储桶,即使是完全统一的随机 分布,至少有两个密钥被散列到同一个存储槽的概率为95%。

因此,大多数哈希表实现有一些冲突 解决方案来处理这种事件。一些常见的策略是下面描述的 。所有这些方法都要求键(或指向它们的指针 )与关联的值一起存储在表中。

相关问题