【发布时间】:2010-11-25 14:35:06
【问题描述】:
根据MSDN,哈希函数必须具有以下属性:
如果两个对象比较相等,则每个对象的 GetHashCode 方法必须返回相同的值。但是,如果两个对象比较不相等,则两个对象的 GetHashCode 方法不必返回不同的值。
只要没有对确定对象 Equals 方法返回值的对象状态进行修改,对象的 GetHashCode 方法就必须始终返回相同的哈希码。请注意,这仅适用于应用程序的当前执行,如果再次运行应用程序,可能会返回不同的哈希码。
为了获得最佳性能,哈希函数必须为所有输入生成随机分布。
我不断发现自己处于以下情况:我创建了一个类,实现了IEquatable<T> 并覆盖了object.Equals(object)。 MSDN 声明:
覆盖 Equals 的类型也必须覆盖 GetHashCode ;否则,Hashtable 可能无法正常工作。
然后它通常对我来说有点停顿。因为,您如何正确覆盖object.GetHashCode()?永远不知道从哪里开始,而且似乎有很多陷阱。
在 StackOverflow 上,有很多与 GetHashCode 覆盖相关的问题,但其中大多数似乎是针对特定情况和特定问题的。所以,因此我想在这里得到一个很好的编译。包含一般建议和指南的概述。做什么,不做什么,常见的陷阱,从哪里开始等等。
我希望它特别针对 C#,但我认为它也适用于其他 .NET 语言(?)。
我认为也许最好的方法是为每个主题创建一个答案,首先是一个快速而简短的答案(如果可能的话,接近单行),然后可能会提供更多信息并以相关问题、讨论结束,博客文章等,如果有的话。然后,我可以仅使用“目录”创建一个帖子作为接受的答案(将其放在首位)。尽量保持简短和简洁。不要只链接到其他问题和博客文章。尝试抓住它们的本质,然后链接到源(特别是因为源可能会消失。另外,请尝试编辑和改进答案,而不是创建许多非常相似的答案。
我不是一个很好的技术作家,但我至少会尝试格式化答案,使它们看起来相似,创建目录等。我也会尝试在这里搜索一些相关问题在 SO 这回答了其中的部分问题,并且可能会提取出我可以管理的那些本质。但是由于我在这个话题上不是很稳定,所以我会尽量远离:p
【问题讨论】:
标签: c# .net hashcode gethashcode