问题标签 [gethashcode]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
11 回答
7104 浏览

c# - 关于如何正确覆盖 object.GetHashCode() 的一般建议和指南

根据MSDN,哈希函数必须具有以下属性:

  1. 如果两个对象比较相等,则每个对象的 GetHashCode 方法必须返回相同的值。但是,如果两个对象比较不相等,则两个对象的 GetHashCode 方法不必返回不同的值。

  2. 只要确定对象的 Equals 方法的返回值的对象状态没有修改,对象的 GetHashCode 方法就必须始终返回相同的哈希码。请注意,这仅适用于应用程序的当前执行,并且如果再次运行应用程序,则可以返回不同的哈希码。

  3. 为了获得最佳性能,散列函数必须为所有输入生成随机分布。


我一直在以下场景中发现自己:我创建了一个类,实现IEquatable<T>并覆盖了object.Equals(object). MSDN指出:

覆盖 Equals 的类型也必须覆盖 GetHashCode ;否则,Hashtable 可能无法正常工作。

然后它通常对我来说有点停顿。因为,您如何正确覆盖object.GetHashCode()?永远不知道从哪里开始,而且似乎有很多陷阱。

在 StackOverflow 上,有很多与 GetHashCode 覆盖相关的问题,但其中大多数似乎是针对特定情况和特定问题的。所以,因此我想在这里得到一个很好的编译。包含一般建议和指南的概述。做什么,不做什么,常见的陷阱,从哪里开始等等。

我希望它特别针对 C#,但我认为它对其他 .NET 语言的工作方式也是一样的(?)。


我认为最好的方法可能是为每个主题创建一个答案,首先是一个快速而简短的答案(如果可能的话,接近单行),然后可能是更多的信息,并以相关的问题、讨论、博客文章等结束。 ,如果有的话。然后,我可以创建一个帖子作为接受的答案(将其放在首位),只需一个“目录”。尽量保持简短和简洁。不要只链接到其他问题和博客文章。尝试获取它们的本质,然后链接到源(特别是因为源可能会消失。另外,请尝试编辑和改进答案,而不是创建许多非常相似的答案。

我不是一个很好的技术作家,但我至少会尝试格式化答案,使它们看起来相似,创建目录等。我还将尝试在 SO 上搜索一些相关问题,以回答部分问题这些,也许会提取出我可以管理的那些精髓。但由于我在这个话题上不是很稳定,我会尽量远离:p

0 投票
7 回答
3885 浏览

c# - 值对象的 IEqualityComparer

我有一个不可变的值对象 IPathwayModule,其值由以下内容定义:

  • (int) 块;
  • (实体)模块,由(字符串)ModuleId 标识;
  • (枚举)状态;和
  • (实体)类,由(字符串)ClassId 标识 - 可以为 null。

这是我当前的 IEqualityComparer 实现,它似乎适用于一些单元测试。但是,我认为我不了解自己做得好到足以知道自己做得是否正确。以前的实现有时会在重复测试运行时失败。

IPathwayModule 绝对是不可变的,具有相同值的不同实例应该相等并产生相同的 HashCode,因为它们被用作 HashSet 中的项目。

我想我的问题是:

  • 在这种情况下我是否正确使用了界面?
  • 是否存在我可能看不到所需行为的情况?
  • 有什么方法可以提高鲁棒性、性能吗?
  • 有没有我没有遵循的良好做法?
0 投票
1 回答
5956 浏览

c# - 具有列表对象的类的 GetHashCode

我有这样一堂课:

如您所见,如果两个EdgeList 相同,那么我认为它们Cycles是相同的。

现在的问题是如何实施GetHashCode()

我试过Edges.GetHashCode()了,但问题是两个List<Cycle>,具有相同的Cycle对象但不同的顺序,将被认为是不同的,即使它们应该是相同的。

0 投票
7 回答
6851 浏览

c# - C#:您将如何对 GetHashCode 进行单元测试?

测试该Equals方法非常简单(据我所知)。但是你到底是如何测试这个GetHashCode方法的呢?

0 投票
2 回答
1290 浏览

c# - C# - 如何用对象中的列表覆盖 GetHashCode

我正在尝试创建一个“KeySet”来修改 UIElement 行为。这个想法是创建一个特殊的功能,例如。用户在按住 a 的同时单击一个元素。或者 ctrl+a。

到目前为止,我的方法首先让我们为所有可能的修饰符创建一个容器。如果我只允许一个键,那将没有问题。我可以使用一个简单的字典,

  • 如果字典为空,则使用默认操作。
  • 如果有条目,请根据当前按下的键检查要使用的操作

如果我不贪心,那就是……当然,我想要更多。我想允许多个键或修饰符。所以我创建了一个包装类,它可以用作我的字典的键。

使用更复杂的类时有一个明显的问题。目前两个不同的实例会创建两个不同的键,因此他永远不会找到我的函数(看代码来理解,真的很明显)

现在我检查了这篇文章:GetHashCode override of object contains generic array这有点帮助。

但我的问题是,我的课程的基本设计还可以吗?我应该使用哈希集来存储修饰符和普通键盘键(而不是列表)。如果是这样,GetHashCode 函数会是什么样子?

我知道,要编写很多代码(无聊的哈希函数),一些技巧足以让我开始。将在这里发布试用...

到目前为止的代码来了,测试显然失败了......

0 投票
1 回答
432 浏览

c# - 是否有一个内置的 IEqualityComparer 只使用它们的哈希值来比较对象?

是否有内置的 IEqualityComparer 根据对象的 GetHashCode 值返回的值来比较对象?它很容易编写,但我更喜欢使用提供的类而不是自定义类。

当前代码:

0 投票
1 回答
434 浏览

.net-2.0 - .Net 2.0 代码中是否实现了与 .Net 1.1 兼容的 String.GetHashCode?

我有一个现有的应用程序,其中我犯了使用 String.GetHashCode 并将其保存到磁盘的错误。现在我正在将应用程序升级到 .Net 2.0,我发现这个决定又回来咬我的屁股了。

我很想知道是否有人知道.Net 1.1 兼容字符串散列算法的.Net 2.0 实现。

显然,最好的解决方案是给自己买一台时间机器,然后回到 2002 年,甚至考虑以这种方式使用哈希码。由于这似乎不太可能,我正在寻找一种解决方法。我的现有用户在他们的系统上拥有这些数据,所以我不可能对哈希值或类似的东西进行一次大的转换。

随着对 2.0 的更改,我将更新代码,因此它当然使用 MD5 或 SHA。

我考虑从 Mono 中提取 String.GetHashCode 源代码,但由于 Mono 是 GPL 并且我的应用程序是商业应用程序,这确实不是一个选择。我什至不知道 Mono 实现是否与 MS .Net 实现兼容,因为 GetHashCode 的合同不要求它兼容。

有任何想法吗?

0 投票
3 回答
8751 浏览

c# - DateTime.Now 是否有自己的 GetHashCode 实现来提供唯一的哈希值?

此处的 MSDN 文章指出,GetHashCode() 的默认实现不保证唯一的结果,不应用作标识符。所以我的问题是 DateTime.Now 是否有自己的实现,可以给出唯一的哈希值。谢谢帮助

0 投票
3 回答
945 浏览

c# - 使用以前从密钥集合中检索到的密钥时出现 KeyNotFoundException?

我有以下代码,由于某种原因,我得到了 KeyNotFoundException,即使我使用的是我在上面检索了几行的密钥。有谁知道这不起作用的情况?我难住了。BTW 'SchemaElementType 是一个枚举。

0 投票
2 回答
1673 浏览

c# - 如何在覆盖 GetHashCode() 的类型上使用 Object.GetHashCode()

我有一个实现 IEquatable<> 的 A 类,使用它的字段(比如 Ab 和 Ac)来实现/覆盖 Equals() 和覆盖 GetHashCode(),99% 的时间一切正常。类 A 是继承自接口 D 的层次结构(类 B、C)的一部分;它们都可以一起存储在字典 Dictionary 中,因此当它们都带有自己的默认 Equals()/GetHashCode() 时会很方便。

但是,在构建 AI 时,有时需要做一些工作来获取 Ab 和 Ac 的值;在发生这种情况时,我想存储对正在构建的实例的引用。在这种情况下,我不想使用 A 提供的默认 Equals()/GetHashCode() 覆盖。因此,我正在考虑实现一个 ReferenceEqualityComparer,这意味着强制使用 Object 的 Equals()/GetHashCode() :

问题是,由于 A 覆盖了 Object.GetHashCode(),我如何(在 A 之外)为 A 的实例调用 Object.GetHashCode()?

一种方法当然是 A 不实现 IEquatable<> 并始终向我创建的任何字典提供 IEqualityComparer<> ,但我希望得到不同的答案。

谢谢