问题标签 [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 与 2 个 EntityCollections 相交
不要过多地重复这个问题,但我已经进行了搜索,结果却一无所获。所以我有两个 T 类型的 EntityCollections,我想在每个中找到共同的项目。捕获?除一个以外的所有字段都必须匹配。例如,如果 T 类型是 CustomSet 类型,并且 CustomSet 包括字段 F1、F2、F3 和 FK 字段 OtherId,则 F1、F2 和 F3 必须匹配(它们可以是字符串、整数,任何东西)并且 OtherId 永远不会匹配。我目前的实现:
将永远不会产生任何结果,因为 OtherId 列将永远不会在任何其他集合中匹配,即使字段 F1、F2 和 F3 可能匹配。所以我提出了一个 IEqualityComparer 的自定义实现,如下所示:
现在,我只是对此进行测试,因此传入的 obj 是 CustomSet 类型,如果我能让它正常运行,我将为我的其他类型添加必要的 if 语句。我知道 Intersect 扩展使用 GetHashCode 而不是 Equals 来比较项目,这就是为什么我真的不在乎我的 equals 中的内容,因为除了 EntityCollections 上的 Intersect 扩展之外,永远不会调用此类。问题是,这行不通。在我的测试集上,我知道我的“源”集合中有 28 个项目,“目标”集合中有 28 个项目,并且所有字段都匹配(显然,OtherId 字段除外)。我遍历了 GetHashCode 代码,因为它循环了 56 次,并且能够匹配每组中所有 28 个项目的哈希码,但“交叉点”的计数为 0。有什么我做错或遗漏的事情吗?谢谢。}
c# - 如何使用修饰键状态成功散列 System.Windows.Input.Key 值?
我正在尝试编写一个哈希算法,它将成功地使用修饰键状态对 System.Windows.Input.Key 值进行哈希处理,例如:
因此,像这样的键值应该与 ctrl、shift、alt 等具有不同状态的其他键值分开。但由于这些只是真或假,我不知道如何使其散列值区分开来?
有任何想法吗?它必须足够独特以处理所有可能的组合键。
c# - 如何根据项目在树中的位置为树状数据结构编写哈希码?
每个项目如下所示:
我想使用这些项目的许多实例创建一个树状结构,这些实例相互连接形成一个树状结构。但后来我想将每个项目散列到字典中,所以我想如果我可以根据它们在树上的位置创建一个散列值,那么我可以获得足够唯一的散列值。
关于如何做到这一点的任何想法?
c# - 当对象的标识符为空时,GetHashCode 应该返回什么?
考虑到身份属性可能为空,以下哪一项是正确/更好的。
或者
更新 1:更新了第二个选项。
更新 2:以下是 Equals 实现:
ID是string
类型。
c# - 如何在 .net (c#) 中为可安全存储在数据库中的字符串创建 HashCode?
引用 Eric Lippert的 GetHashCode 指南和规则:
规则:GetHashCode 的消费者不能依赖它随着时间的推移或跨应用程序域而保持稳定
假设您有一个 Customer 对象,该对象具有一堆字段,例如名称、地址等。如果您在两个不同的进程中创建两个具有完全相同数据的此类对象,则它们不必返回相同的哈希码。如果您在星期二在一个进程中创建这样的对象,然后将其关闭,然后在星期三再次运行该程序,则哈希码可能会有所不同。
这在过去曾咬人。System.String.GetHashCode 的文档特别指出,两个相同的字符串在不同版本的 CLR 中可以具有不同的哈希码,事实上它们确实如此。不要在数据库中存储字符串哈希并期望它们永远相同,因为它们不会。
那么创建可以存储在数据库中的字符串的 HashCode 的正确方法是什么?
(请告诉我,我不是第一个在我编写的软件中留下这个错误的人!)
c# - 为 String.GetHashCode() 创建重载以在 x86 和 x64 环境中返回相同的值
我有一个场景,我的服务器端代码在 x86 环境中运行,而客户端在 x64 中运行。问题正在发生,我们正在使用 String.GetHashCode() 来识别 HashTable 中的对象,因为“GetHashCode 的行为取决于它的实现,这可能会从公共语言运行时的一个版本更改为另一个版本。” -MSDN。我使用不安全代码从以下堆栈溢出问题创建 x86 等效 GetHashCode():我可以依赖 GetHashCode() 的值来保持一致吗?.
我有几个问题:
- 是否建议将不安全的代码留在托管代码世界中。
- 如何将上述问题中的不安全代码转换为安全代码。
c# - 在数据库中存储 C# GetHashCode() 是不可靠的
我计划在我的数据库中存储数十万个 URL。我的 UrlInfo 表中的每一行都是不可变的,而 URL 本身就是逻辑主键。由于 URL 可能相当长,因此我决定对 URL 进行哈希处理,以便在添加新行时快速找到可能的匹配项。哈希不是我真正的关键,只是一种快速找到可能匹配项的方法。此外,我使用每个域的 RegEx 模式,将 URL 的本质提炼成可以与其他 URL 进行比较的东西。我将 RegEx 的结果也存储为哈希,我不担心它是否会产生可能的重复项。
一切都很顺利,直到我了解到 C# 的 string.GetHashCode() 方法(我一直用来散列事物)不能保证在 .Net 的实现中是唯一的。当我尝试将哈希函数从 ASP.Net 移动到 SQLServer CLR 代码时,我注意到了这一点。Web 应用程序使用 .Net 4.0,我了解到,SQLServer 2008 R2 使用 .Net 3.5。他们为相同的字符串产生了单独的哈希结果,所以现在我需要摆脱使用 string.GetHashCode() ,因为当我将应用程序升级到未来版本的 .Net 时,我不想担心这种变化。
所以,问题:
自从我在我的数据库中存储哈希后,我的架构是否有异味?还有更好的方法吗?显然微软不希望我存储哈希结果!
有人可以推荐一个好的 C# 替换算法来散列字符串吗?我在这里看到了 Jon,但不确定如何修改以适用于字符串(使用 ascii 代码循环遍历每个字符?)。
有没有比使用哈希算法更好的字符串压缩算法?
谢谢
许多人的反应很棒。非常感谢你!!!
c# - C# GetHashCode 问题
GetHashCode
当我的对象被认为是相等的(如果它们中至少有一个字段匹配)时,覆盖该案例的函数的最佳方法是什么。
在泛型Equals
方法的情况下,示例可能如下所示:
不过,我对GetHashCode
为这种情况做出良好的实施感到困惑。
这应该怎么做?
谢谢你。
c# - 覆盖具有“dibs”的类型的 Equals 和 GetHashCode?
这个问题和 Jon 的回答让我意识到这甚至存在,所以我很好奇并启动了 Visual Studio。
我遵循了 MSDN 页面的一个示例,然后创建了自己的小示例。如下:
所以我有几个问题:
如果 Equals 方法在处理我的自定义相等方面做得很好,为什么我还必须重写 GetHashCode 方法?
在比较类似下面的内容时,使用哪个比较器,Equals 还是 GetHashCode?
.
- 运算符方法到底是做什么的?看起来那里正在发生某种伏都教黑魔法。
c# - 我是否正确实现了 Equals()/GetHashCode()?
该程序正在使用此实现:
但是因为我需要在 Dictionary 中使用 Instrument,所以我决定实现 equals/hashcode:
现在该程序已停止工作。在这样或类似的地方,我收到“KeyNotFoundException”:
是否有可能某些代码假定未实现等于和哈希码?或者我可能只是错误地实施了它们?抱歉,我不熟悉 C# 中的最后一段代码这样的高级功能,也不知道它是如何与 equals 或 hashCode 连接的。