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

c# - C#中类的GetHashCode等于实现

我有一个 Person 类,我必须为其重写 Equals 和 GetHashCode 方法。如果名称匹配或电子邮件匹配,则两个人对象相等。使用相当有效的哈希函数来做这件事的好方法是什么?

0 投票
1 回答
290 浏览

c# - 为什么我不能在 EF4 中的多对多实体上覆盖 GetHashCode?

我的 Entity Framework 4 模型(与 MS SQL Server Express 一起使用)中有一个多对多关系:Patient-PatientDevice-Device。我正在使用 Poco,所以我的 PatientDevice 类如下所示:

当我这样做时一切正常:

但是如果我在 PatientDevice-class 中取消注释 GetHashCode,患者仍然有之前添加的 PatientDevice。

覆盖 GetHashCode 并返回 Id 有什么问题?

0 投票
2 回答
1187 浏览

.net - 为对象生成哈希码

我有一个DataPointCollection带有两个 Integer 属性和一个 Guid 属性的自定义对象 ( )。我希望该对象生成一个 HashCode,以便不会将这些属性中具有相同值的两个对象添加到 HashSet。我知道我需要重写该GetHashCode()方法,但是如何生成哈希码来完成此操作?

这就是我想要使用它的方式。

我对其他想法持开放态度,但我认为这可能比对对象集合执行 LINQ 查询更快(这些对象可能非常多)。

0 投票
6 回答
56643 浏览

c# - 覆盖 GetHashCode

如您所知,GetHashCode 返回一个半唯一值,可用于标识集合中的对象实例。作为一种好的做法,建议重写此方法并实现您自己的方法。

我的问题是 - 您在处理自定义对象时是否覆盖此方法?如果是这样,您使用什么算法来生成唯一 ID?

我正在考虑生成一个 GUID,然后从该标识符获取整数数据。

0 投票
8 回答
3860 浏览

c# - 在 Equals 覆盖中使用 GetHashCode 测试相等性

可以调用 GetHashCode 作为从 Equals 覆盖内部测试相等性的方法吗?

例如,此代码是否可接受?

0 投票
1 回答
196 浏览

c# - 使用 C# GetHashCode() 比较数据图

我有一张数据图,我使用多个 REST 调用从 OAuth 源中提取数据,并将其以关系方式存储在数据库中。数据结构最终有大约 5-10 个表,其中包含多个一对多关系。我想定期重新检索该信息,以查看我的数据库中是否需要更新。

由于我将为许多用户执行此操作,并且他们的数据可能不会经常更改,因此我的目标是尽量减少不必要的数据库负载。我的策略是从我的 OAuth 提供程序查询数据,然后对结果进行哈希处理并将其与我为同一数据集生成的最后一个哈希值进行比较。如果哈希不匹配,那么我只需在数据库中启动一个事务,删除该用户的所有数据,重新写入数据,然后关闭事务。这节省了我从数据库中读取数据并进行所有比较工作以查看发生了什么变化、添加了哪些行、删除了哪些行等的时间。

所以我的问题是:如果我将所有数据作为一个大字符串在内存中粘合在一起并使用 C# GetHasCode(),那么检查我的数据是否已更改的机制是否相当可靠?或者,有没有更好的方法给这只猫剥皮?

谢谢

0 投票
2 回答
11779 浏览

c# - String.GetHashCode() 返回不同的值

为什么 GetHashCode() 为相同的字符串返回不同的值?我无法描述如何复制它,但相信这不是一个恶作剧,并且以下两行来自我的观察窗口在两个不同的时间:

这怎么可能发生?

我不知道这是否有帮助,但我在 VS 2010 中的 .NET 4.0 上运行,并且正在调试 NServiceBus 应用程序。

更新:

如果您想知道我最终为此做了什么,请查看此线程:Can you generate an x​​86 hash value when running in x64 mode?

0 投票
7 回答
22971 浏览

c# - 使用 GetHashCode 获取 Enum int 值

我有一个枚举

我必须使用此枚举在网格列中进行搜索。

获取我正在使用的列索引

哪个工作正常,或者我应该使用

我对使用GetHashCode(). 使用它有什么问题吗?

0 投票
1 回答
2239 浏览

c# - e.keyChar 不适用于 Ctrl

此代码显示按下按钮的哈希码,但是当我按下控制按钮时,我什么也不做。可以帮我一个人吗?

C# WinForms

0 投票
7 回答
8025 浏览

vb.net - 在没有选中/未选中关键字支持的情况下覆盖 VB 中的 GetHashCode?

所以我试图弄清楚如何GetHashCode()在 VB 中正确覆盖大量自定义对象。稍微搜索一下,我就得到了这个美妙的答案

除了有一个问题:VB在.NET 4.0 中缺少checkedand关键字。unchecked据我所知,无论如何。因此,使用 Jon Skeet 的实现,我尝试在一个相当简单的类上创建这样的覆盖,该类具有三个主要成员:Name As StringValue As Int32[Type] As System.Type. 因此,我想出了:

问题:对于像这样的简单对象,Int32 太小了。我测试的特定实例将“名称”作为一个简单的 5 字符字符串,并且仅该哈希就足够接近 Int32 的上限,当它试图计算哈希的第二个字段(值)时,它会溢出。因为我找不到粒度checked/unchecked支持的 VB 等效项,所以我无法解决这个问题。

我也不想在整个项目中删除整数溢出检查。这件事可能已经完成了....40%(这是我编的,TBH),而且我还有很多代码要编写,所以我需要在相当长的一段时间内完成这些溢出检查。

Jon 的GetHashCodeVB 和 Int32 版本的“安全”版本是什么?或者,.NET 4.0 中是否有checked/unchecked我在 MSDN 上不太容易找到的地方?


编辑:
根据链接的 SO 问题,最底部不受欢迎的答案之一提供了解决方案。我说准是因为感觉它是……作弊。不过,乞丐不能挑剔,对吧?

从 C# 翻译成更易读的 VB 并与上述对象(名称、值、类型)对齐,我们得到:

这显然会触发编译器通过生成一个匿名类型来“作弊”,然后它会在项目命名空间之外进行编译,大概禁用整数溢出检查,并允许进行数学运算并在溢出时简单地回绕。它似乎也涉及box操作码,我知道这会影响性能。不过没有拆箱。

但这提出了一个有趣的问题。无数次,我在这里和其他地方看到它指出 VB 和 C# 都生成相同的 IL 代码。这显然不是 100% 的情况......就像使用 C# 的unchecked关键字只会导致发出不同的操作码。那么为什么我会继续看到两者都产生完全相同的 IL 的假设不断重复呢?  </修辞问题>

无论如何,我宁愿找到一个可以在每个对象模块中实现的解决方案。从 ILDASM 的角度来看,必须为我的每一个对象创建匿名类型看起来会很混乱。当我说我的项目中实现了很多类时,我不是在开玩笑。


EDIT2:我确实在 MSFT Connect 上打开了一个错误,VB PM 结果的要点是他们会考虑它,但不要屏住呼吸: https ://connect.microsoft.com/VisualStudio/反馈/详细信息/636564/checked-unchecked-keywords-in-visual-basic

快速浏览一下 .NET 4.5 的变化表明他们还没有考虑到它,所以也许是 .NET 5?

下面是我的最终实现,它符合 GetHashCode 的约束,同时对于 VB 来说仍然足够快且足够独特,源自此页面上的“旋转哈希”示例:

我也认为“Shift-Add-XOR”哈希也可能适用,但我还没有测试过。