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