问题标签 [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 投票
7 回答
11205 浏览

c# - 为什么 C# 不为集合实现 GetHashCode?

我正在将一些东西从 Java 移植到 C#。在 Javahashcode中 aArrayList取决于其中的项目。在 C# 中,我总是从List...

为什么是这样?

对于我的一些对象,哈希码需要不同,因为它们的列表属性中的对象使对象不相等。我希望哈希码对于对象的状态始终是唯一的,并且仅在对象相等时才等于另一个哈希码。我错了吗?

0 投票
3 回答
7206 浏览

c# - C#如何从对象引用计算哈希码

伙计们,这是一个棘手的问题!

TickZoom 系统的一部分必须将每种类型的对象的实例收集到 Dictionary<> 类型中。

它们的相等性和哈希码必须基于对象的实例,这意味着引用相等而不是值相等。挑战在于系统中的某些对象已覆盖 Equals() 和 GetHashCode() 以用作值相等,并且它们的内部值会随着时间而改变。这意味着它们的 Equals 和 GetHashCode 是无用的。如何一般而不是侵入性地解决这个问题?

到目前为止,我们创建了一个结构来包装每个名为 ObjectHandle 的对象,以便散列到 Dictionary 中。正如你在下面看到的,我们实现了 Equals() 但如何计算哈希码的问题仍然存在。

看?有方法 object.ReferenceEquals() 将比较引用相等性,而不考虑对象中任何重写的 Equals() 实现。

现在,如何只考虑引用而不考虑任何覆盖的 GetHashCode() 方法来计算匹配的 GetHashCode()?

啊,我希望这能给你一个有趣的谜题。我们被困在这里。

真诚的,韦恩

0 投票
1 回答
2037 浏览

c# - 实体框架 4 覆盖自己的类属性的 Equals 和 GetHashCode

我正在使用带有 .NET 4 和 Entity Framework 4 的 Visual Studio 2010。我正在使用 POCO 类而不是 EF4 生成器。我需要重写Equals()andGetHashCode()方法,但这并没有真正起作用。我认为这是每个人都会做的事情,但我在网上找不到任何关于这个问题的信息。

当我编写自己的类和Equals方法时,我使用Equals()了需要由 EF 加载才能填充的属性。像这样:

该代码不起作用。问题出在我试图从哪里得到Equals或从哪里得到。每次,如果我尝试通过 Linq2Entites 获取数据,我都会收到 NullRefernceException。GetHashCodeHashCodeEqualItemType

修复它的一种肮脏方法是捕获 NullReferenceException 并返回false(通过 Equals)并返回base.GetHashCode()(通过GethashCode),但我希望有更好的方法来解决这个问题。

我编写了一个小测试项目,其中包含用于 DB 和 POCO 域的 SQL 脚本、EDMX 文件和控制台测试主要方法。你可以在这里下载: 下载

0 投票
6 回答
3515 浏览

.net - 为什么 System.String 对象不会缓存其哈希码?

浏览一下string.GetHashCode使用Reflector的源代码会发现以下内容(对于 mscorlib.dll 版本 4.0):

现在,我意识到的实现GetHashCode没有指定并且是依赖于实现的,所以问题是“GetHashCode以 X 或 Y 的形式实现?” 不是真的可以回答。我只是对几件事感到好奇:

  1. 如果 Reflector 正确地反汇编了 DLL 并且这(在我的环境中)的实现GetHashCode,我是否正确地解释了这段代码以指示string基于这个特定实现的对象不会缓存其哈希码?
  2. 假设答案是肯定的,为什么会这样?在我看来,内存成本将是最小的(多一个 32 位整数,与字符串本身的大小相比减少了),而节省的成本将是显着的,尤其是在使用字符串的情况下作为基于哈希表的集合中的键,例如Dictionary<string, [...]>. 而且由于string该类是不可变的,因此返回的值GetHashCode甚至不会改变。

我会错过什么?


更新:回应安德拉斯佐尔坦的闭幕词:

蒂姆的回答(+1 那里)也很重要。如果他是对的,我认为他是对的,那么就不能保证字符串在构造后实际上是不可变的,因此缓存结果是错误的。

哇哇哇!_ 这是一个有趣的观点(是的,这是非常正确的),但我真的怀疑GetHashCode. “因此缓存结果是错误的”这句话对我来说意味着框架对字符串的态度是“好吧,它们应该是不可变的,但如果开发人员想要偷偷摸摸,它们是可变的,所以我们会处理他们就是这样。” 这绝对不是框架查看字符串的方式。它在很多方面完全依赖于它们的不变性(字符串文字的实习,将所有零长度字符串分配给string.Empty等),基本上,如果你改变一个字符串,你正在编写其行为完全未定义和不可预测的代码。

我想我的意思是让这个实现的作者担心,“如果这个字符串实例在调用之间被修改了怎么办,即使它公开暴露的类是不可变的?” 就像一个计划休闲户外烧烤的人会想他/她自己,“如果有人把原子弹带到聚会上怎么办?” 听着,如果有人带了原子弹,派对就结束了。

0 投票
2 回答
224 浏览

.net - 使用可变对象作为字典中的键完全可以吗?

假设我有一些特殊的课程 ,WrappedDataTable并且我想将每个课程WrappedDataTable与一个联系起来DataTable。此外,我希望WrappedDataTable任何给定的DataTable.

一位同事建议我可以缓存我的WrappedDataTable并使用工厂方法来访问一个,如下所示:

起初这让我觉得很可疑,我想是因为我已经熟悉字典中的键应该是不可变类型的想法。但也许情况不一定如此?一项快速测试向我DataTable显示,在对其内容进行多次修改的过程中,a 似乎保持了一致的哈希码;因此, aDictionary<DataTable, TValue>似乎能够ContainsKey一致地返回正确的值。

我想知道的是object.GetHashCode,默认情况下的基本版本是否会为每个单独的对象返回一个不变的值,或者我所看到DataTable的只是一种错觉?

如果前者是真的——并且object.GetHashCode工作得很好——那么“只使用不可变类型作为键”的建议似乎真的只适用于以下场景:

  1. 您希望对象的平等是关于价值平等而不是引用平等,和/或:
  2. 您有一个自定义类型,它有自己的GetHashCode实现,它基于类型的成员。

有哪位大神能帮我解释一下吗?


更新:感谢 Jon Skeet 回答我的问题。在其他新闻中,我做了一些挖掘,并认为我想出了一个IEqualityComparer<T>确实提供身份比较的方法!检查一下(对不起 VB.NET 的讨厌者,我刚刚创建了一个 VB.NET 项目,所以这就是我写的——翻译很简单):

看一下这个示例程序:

输出:

0 投票
2 回答
2892 浏览

c# - 为 BitArray 生成良好的哈希码 (GetHashCode)

我需要在 GetHashCode 中为 BitArray 生成一个快速哈希码。我有一个字典,其中的键是 BitArrays,并且所有 BitArrays 的长度都相同。

有没有人知道一种从可变位数生成良好哈希的快速方法,就像在这种情况下一样?

更新:

我最初采用的方法是直接通过反射访问内部整数数组(在这种情况下,速度比封装更重要),然后对这些值进行异或。XOR 方法似乎运作良好,即在 Dictionary 中搜索时不会过度调用我的“Equals”方法:

然而,Mark Byers 建议并在 StackOverflow 其他地方看到的方法稍微好一些(16570 Equals 调用 vs 16608 用于我的测试数据的 XOR)。请注意,这种方法修复了前一种方法中的一个错误,即位数组末尾之外的位可能会影响哈希值。如果位数组的长度减少,就会发生这种情况。

GetInternalValues 扩展方法是这样实现的:

欢迎任何改进建议!

0 投票
1 回答
478 浏览

.net - 编译器生成的 GetHashCode()

我正在为在 .net 上运行的语言编写编译器,我想做的一件事是自动生成 GetHashCode 方法,但我有几个问题:

  • 这可能吗,编译器是否对所涉及的类型足够了解以合理地实现该方法?
  • 我应该为值类型、引用类型还是两者都这样做?
  • 什么是编译器生成的合理的 GetHashCode 算法,包括对空属性的支持等等?
  • 这是用我可以查看的另一种语言/编译器完成的吗?
  • 如果这是不可能的或者是一个非常糟糕的主意,为什么?

谢谢

0 投票
1 回答
1490 浏览

c# - 小班的好哈希?(覆盖 GetHashCode)

我使用一些包含 1-2 个整数的身份类/结构,也可能是一个日期时间或一个小字符串。我将这些用作字典中的键。

对于这样的事情,什么是对 GetHashCode 的良好覆盖?一些非常简单但仍然希望有一些性能的东西。

谢谢

0 投票
3 回答
550 浏览

c# - Equals、GetHashCode、EqualityComparers 和模糊相等

对于具有属性 A、B、C、D、StartDate 和 EndDate 的对象,如果我想实现任何两个对象相等的东西,如果它们具有相同的 A、B 和 C 以及重叠的日期范围,那该怎么做?

我试过像这样创建一个 EqualityComparer

但是框架中的很多地方似乎都忽略了 Equals 并使用了 GetHashCode ,并且文档对此根本不清楚。当我去实现 GetHashCode 时,我不知道如何在不忽略日期的情况下使 HashCodes 变得相同。

为了使它更具体一点,这与项目管理和费率有关。我想实施一个业务规则,即同一项目中同一角色的同一个人在同一时间段内不能有不同的费率。因此,在 Project DeathMarch 中担任 DBA 角色的 Bob 在任何给定时间只能有一个有效的账单费率来记录他的时间。如果他需要在同一时间段内以不同的速度在 QA 分析师的角色中记录几个小时,那没关系。这是一个庞大的预先存在的系统,因此更改域对象结构不是一种选择。

0 投票
5 回答
17992 浏览

c# - 带有字符串键的 GetHashCode()

大家好,我一直在阅读为 .NET 中的对象实现 GetHashCode() 覆盖的最佳方法,并且我遇到的大多数答案都涉及以某种方式将数字类型的成员中的数字组合在一起以提出一种方法。问题是,我有一个使用字母数字字符串作为键的对象,我想知道仅使用字符串作为键的对象的内部 ID 是否存在根本性错误,如下所示?

有没有更好的方法来为使用字母数字字符串作为键的对象提供唯一的哈希码?(不,字母数字字符串的数字部分不是唯一的;其中一些字符串实际上根本没有数字。)任何想法都将不胜感激!