问题标签 [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.
c# - 通用 IEqualityComparer和 GetHashCode
对实现大量 IEqualityComparers 有点懒惰,并且鉴于我无法轻松编辑被比较对象的类实现,我选择了以下内容,旨在与 Distinct() 和 except() 扩展方法一起使用。:
看起来不错,但是每次都提供哈希函数真的有必要吗?我了解哈希码用于将对象放入存储桶中。不同的bucket,object不相等,不调用equal。
如果 GetHashCode 返回相同的值,则调用 equals。(来自:为什么在重写 Equals 方法时重写 GetHashCode 很重要?)
那么,例如(我听到很多程序员惊恐地尖叫),GetHashCode 返回一个常量,强制调用 Equal 会出现什么问题?
.net - 比较对象时等于与 GetHashCode
在实现自定义类实例比较时,我们是否应该同时覆盖Equals
和属性?GetHashCode
在下面的代码中,我有一个类的集合。类A
是比较的ID
,类是比较B
的Code
。
输出是:
如果评论Code = "one B+"
的输出是
现在我问自己,如果这似乎对比较没有影响,我应该Equals
在课堂上覆盖什么?B
GetHasCode()
对于这种比较来说,压倒一切是否足够?
c# - 使用其哈希码引用对象?
我已经创建了一个对象,请说详细信息。然后我分配: int x = details.GetHashCode();
在程序的后面,我想使用整数 x 访问这个对象。有没有办法在 C# 中做到这一点?
非常感谢
保罗
c# - GetHashCode() 在不同的服务器上给出不同的结果?
我像这样声明了一行 C# 代码
在我的电脑、工作的电脑和朋友的电脑上,结果是 1657858284。在开发服务器上,结果是 1548091822。有没有办法告诉项目始终让 GetHashCode() 产生 1657858284,不管它在哪个服务器上?
更多注释 起初,我注意到版本有所不同... 1657858284 结果来自 .NET 3.5 和 .NET 4.0。1548091822 来自 .NET 2.0。
然后我告诉 Visual Studios 2010 将项目编译为 .net 2.0 项目,但它仍然给了我 1657858284。
c# - 等效内容相等并返回相同哈希码的字典的实现,无论插入顺序如何
我需要使用Dictionary<long, string>
给定两个实例的集合,d1
并且d2
它们每个都具有相同的KeyValuePair<long, string>
内容,可以按任何顺序插入:
(d1 == d2)
评估为true
d1.GetHashCode()
==d2.GetHashCode()
通过使用 aSortedDictionary
而不是常规的 ,最容易实现第一个要求Dictionary
。
第二个要求是必要的,因为我有一个需要存储Dictionary<Dictionary<long, string>, List<string>
的点 - 主要Dictionary
类型用作另一个的键Dictionary
,如果 HashCodes 不基于相同的内容进行评估,则 usingContainsKey()
将无法按我想要的方式工作(即:如果已经有一个项目插入到字典中,d1
作为它的键,那么dictionary.ContainsKey(d2)
应该评估为true
.
为此,我创建了一个新对象class ComparableDictionary : SortedDictionary<long, string>
,并包含以下内容:
在我的单元测试中,这符合相等和哈希码的标准。但是,在阅读GetHashCode 的指南和规则时,我遇到了以下问题:
规则:当对象包含在依赖于哈希码保持稳定的数据结构中时,GetHashCode 返回的整数永远不能改变
虽然很危险,但允许对象的哈希码值随着对象的字段发生变异而发生变异是允许的。如果你有这样一个对象并且你把它放在一个哈希表中,那么改变对象的代码和维护哈希表的代码需要有一些商定的协议,以确保对象在它存在时不会发生变异哈希表。该协议的外观取决于您。
如果对象的哈希码在哈希表中时可能会发生变异,那么显然 Contains 方法将停止工作。您将对象放入存储桶#5,对其进行变异,当您询问集合是否包含变异对象时,它在存储桶#74 中查找并没有找到它。
请记住,对象可以以您意想不到的方式放入哈希表中。许多 LINQ 序列运算符在内部使用哈希表。不要在枚举返回对象的 LINQ 查询时危险地改变对象!
现在,在代码中只使用一次,在一个应该设置Dictionary<ComparableDictionary, List<String>>
所有集合的内容的地方。ComparableDictionary
因此,根据这些准则,我认为像我所做的那样覆盖是可以接受的GetHashCode
(完全基于字典的内容)。
在介绍之后,我的问题是:
- 我知道与(我可以有数百个对象实例化)
SortedDictionary
相比,它的性能非常差。Dictionary
使用的唯一原因SortedDictionary
是我可以根据字典的内容进行相等比较工作,而不管插入顺序如何。有没有更好的方法来实现这个平等要求而不必使用 aSortedDictionary
? GetHashCode
根据要求,我的实施是否可以接受?即使它基于可变内容,我认为这不会带来任何风险,因为它唯一使用的地方(我认为)是在设置内容之后。
注意:虽然我一直在使用Dictionary
or设置这些SortedDictionary
,但我并不喜欢这些集合类型。主要需求是一个可以存储值对并满足上面定义的相等和散列要求的集合。
nhibernate - 休眠 gethashcode 行为
在过去的 3 天里,我一直在为一种有趣的行为而苦苦挣扎,至少对我来说是这样。基本概念如下:在内存中创建一个对象,该对象有一个子列表。这个对象被保存到数据库中,孩子也被保存,级联模式。这工作正常,但如果在我保存之后我尝试删除一个孩子,从列表中删除,这不起作用,列表不会删除孩子。我发现列表HashedSet
类型以某种方式缓存对象的哈希码,当它第一次插入列表时,在保存之前,在保存之后相同的对象没有相同的哈希码。但是该列表仍然假定旧的哈希码。我已经覆盖了GetHashCode
and Equals
,经过大量的谷歌搜索和阅读,我找到了一篇博客文章这解释了 nhibernate 对GetHashCode
andEquals
方法的使用。
这是我的实现
我使用了一个名为 orgHashCode 的变量,它在生成第一个哈希码之前返回哈希码,如果我使用这种方法,它似乎可以工作,但我认为这不是最好的解决方案,应该为当前对象生成哈希码而不是对于它的“第一个版本”。
我不知道我的解释是否足够清楚。任何提示将不胜感激。谢谢
.net - 为什么使用 GetHashCode() 而不是 Equals()?
HashSet<T>.Add
首先比较的结果GetHashCode
。如果它们相等,则调用Equals
.
现在,我的理解是为了实现GetHashCode
,必须对对象的字段做一些事情。一个简单的示例实现可以在What is the best algorithm for an overridden System.Object.GetHashCode?.
在我的测试中,比较了 1.000.000 对充满随机数据的对象,两者的性能或多或少相等。GetHashCode
如链接示例中那样实现,Equals
只需调用Equals
所有字段。那么为什么要使用GetHashCode
overEquals
呢?
linq - Linq Union - IEqualityComparer and # of executions
Out of interest how does the GetHashCode of a concrete implementation of IEqualityComparer work?
The reason that I ask is that I'm using linq to union two collections, and when only the left collection has an item GetHashCode is called twice. Further to that, it's called four times if both collections have one row.
This is rough typing but you'll get the point. GetHashCode is called twice, which I'm guessing is twice for the one item in listOne?
e.g.
Thanks
xamarin.ios - GetHashCode() 在 MonoTouch 中对 NSObject 派生对象是否正常工作?
当您从 NSObject 驱动的对象调用 GetHashCode() 时,我试图弄清楚 MonoTouch 是否正确调用了底层的“哈希”消息。快速检查任意对象(在我的示例中为 NSAttributedString)的 GetHashCode()(在 MD 的程序集浏览器中)的实现有它调用 object.InternalGetHashCode(),所以我怀疑它不调用“hash”。“哈希”似乎也没有暴露,这让我怀疑还有另一种方法可以得到它。以前有人走过这条路吗?
c# - 单元测试 - 当您的代码几乎只是一个计算(例如 GetHashCode)时,您会怎么做?
当您对 GetHashCode 进行单元测试时,我在计算原始组件和重复函数或使用预定值之间纠结:
还是有其他方法?