回答
GetHashCode()
的合同要求它,但由于任何人都可以自己实施,所以不能保证。
许多类(尤其是哈希表)需要它才能正确运行。
如果您正在实现一个类,您应该始终确保两个相等的对象具有相同的哈希码。
如果你正在实现一个实用方法/类,你可以假设两个相同的对象具有相同的哈希码(如果没有,它是另一个类,而不是你的,就是越野车)。
如果您正在实施某些具有安全隐患的事情,那么不能承担。
如果'K.Equals(M)'但是'GetHashCode()'的值不同,那么这个类就是越野车,并且可能不应该被使用。 –
它取决于对象的Equals实现。它可能在引擎盖下使用GetHashCode
,但它不会有。所以基本上如果你有一个自定义Equals实现的对象,HashCode对于这两个对象都可能是不同的。
如果是这种情况,该类型违反了GetHashCode的约定。 –
Yes, it should return the same hash code.
我想说它是独立于语言的。但没有其他程序正确执行的保证。
GetHashCode返回基于当前实例的值,该值是 适合哈希算法和数据结构,诸如哈希 表。两个相同类型且相同的对象必须返回 相同的哈希码,以确保 System.Collections.HashTable和 System.Collections.Generic.Dictionary的实例正常工作。
如果这是真的,K和M总是有相同的HashCode?
是的。
或者宁可应该就是这样。散列码(例如容器)的使用者可以假定相同的对象具有相同的散列码,或者不相等的散列码意味着对象不相等。 (不相等的对象可以具有相同的哈希代码:存在比哈希代码更多的可能对象,因此必须允许。)
或者它取决于编程语言?
在应用程序中的散列码具有唯一标识对象的实例没有
。这是在.NET平台上,因此,哈希码值应该工作的一部分不管哪个.NET语言,你在创作英寸
哈希码无法保证唯一性。为了窃取和解释Eric Lippert的一行,大约有40亿个可能的散列码结果,有无数个可能的对象,例如字符串。最好的做法是使用散列码来减少群体的数量,但预计不会匹配一个对象。 –
我应该说对象的唯一价值 – Jason
如果这是真的,K和M总是有相同的hashCode?
是的。除非他们有一个邪恶的重写Equals方法。但那会被认为是坏的。
但是注意,反之则不然,
如果K和M有相同的hashCode它仍然是K.Equals(M) == false
所以所有的企鹅都是鸟类,但所有的鸟类都不是企鹅。 –
@Soner:不,那是另一个概念。允许哈希代码碰撞,这不符合集合描述。 –
GetHashCode()
可以返回相同的散列不同的对象。如果GetHashCode()
返回相同的值,则应使用Equals()
比较不为GetHashCode(),
的对象 - 实施Equals()
应考虑另一个对象相等性检查。
散列数据结构能够通过使用冲突解决方案算法来处理这种情况。
哈希冲突散列一大组可能的密钥的随机 子集时,实际上是不可避免的。例如,根据生日问题,如果有2500个密钥被 散列成百万个存储桶,即使是完全统一的随机 分布,至少有两个密钥被散列到同一个存储槽的概率为95%。
因此,大多数哈希表实现有一些冲突 解决方案来处理这种事件。一些常见的策略是下面描述的 。所有这些方法都要求键(或指向它们的指针 )与关联的值一起存储在表中。
- 1. 具有相同的hashCode相等的对象不映射到相同值的HashMap
- 2. E2033类型必须相同
- 3. Equal对象必须具有相同的哈希码?
- 4. 两个相等的对象必须具有相同的toString输出吗?
- 5. memcpy params必须是相同的类型?
- 6. 相同的对象
- 7. Java的两个Set对象 - hashCode()是相同的,但.equals()失败
- 8. Java hashCode()在创建相同对象的不同执行方面有所不同
- 9. ArrayList - 添加“相同”的对象(same => equals,hashCode),线程
- 10. HashMap对于不同的内容产生相同的hashCode
- 11. 当两个相同类型的对象具有相同的值时,为什么hashcode不同?
- 12. 为什么hashCode的价值是相同的,而所有不同String对象
- 13. Keras ValueError:尺寸必须相同
- 14. 相同类别的组对象C#
- 15. 两个对象有相同的引用是绝对相同的?
- 16. 相同的JSON对象值
- 17. 为什么对象不相同添加有相同的值,HashSet的,甚至的hashCode和equals被覆写
- 18. “使用==> plot矢量的错误必须是相同的长度。”对于相同长度的载体
- 19. 必须按顺序创建的对象的架构设计如果不相同,则密切相关
- 20. 比较具有相同值的非相同对象
- 21. 设计模式 - 不同的对象,返回相同的对象
- 22. 获取相同的对象休眠到不同的对象
- 23. C#:比较具有相同属性的不同对象集
- 24. 2记录规则,相同的对象,相同的组,不同的域
- 25. 对不同对象的两种不同查询,结果相同
- 26. java.util.HashMap get:key必须与存储在HashMap中的对象完全相同,或者密钥可以“相等”
- 27. 提供的url必须具有相同的域名
- 28. 做而输出的模式必须是相同的例子
- 29. matlab中的向量必须是相同的长度误差
- 30. LinearLayout中的图像是否必须具有相同的大小?
您的问题已经在您链接到的MSDN上的HashCode文章中得到了解答。 –
欲了解更多信息,请阅读[盗版'代码](http://blogs.msdn.com/b/ericlippert/archive/2011/02/28/guidelines-and-rules-for-gethashcode.aspx)。 –