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

c# - 是否可以结合私有成员的哈希码来生成新的哈希码?

我有一个对象,我想为其生成一个唯一的哈希(覆盖 GetHashCode()),但我想避免溢出或不可预测的事情。

该代码应该是组合一小部分字符串的哈希码的结果。

散列码将是生成缓存键的一部分,因此理想情况下它们应该是唯一的,但是被散列的可能值的数量很小,所以我认为概率在这里对我有利。

这样的事情就足够了吗?有没有更好的方法呢?

编辑:感谢到目前为止的回答。@Jon Skeet:不,顺序不重要

我想这几乎是另一个问题,但由于我使用结果来生成缓存键(字符串),使用像 MD5 这样的加密哈希函数还是只使用这个 int 的字符串表示是否有意义?

0 投票
3 回答
1208 浏览

c# - 如何覆盖特定 NHibernate 类的等于

我正在努力弄清楚我应该如何覆盖 equals 并为我正在使用 NHibernate 编写的类获取哈希码。

基本业务场景是用户不能在 90 天内重复使用相同的密码。

所以我有一个“用户”,它有很多“历史密码”......用户类很简单,因为我只是在等号中使用登录名。下面是我的 HistoricalPassword 类。

我会从商业角度说 User 和 ChangeDate 的组合会给我平等。但是......在 equals 方法中引用用户似乎不正确(因为一件事会导致延迟加载发生)......而且从我使用 HistoricalPasswordId 的 PK 阅读的内容来看,这是一个禁忌也是。

任何人都可以就如何为此覆盖 equals 提供一些建议吗?

编辑 ::: 我想我问这个问题的方式可能有点误导。对于如何执行确保密码不被重用的业务规则,我并不感到困惑……也不知道我如何知道两个密码是否相等或是否安全。我真正想知道的是与 NHibernate 相关的实体级别,我将如何覆盖该对象的 Equals,以便 NHibenate 不会在会话和/或缓存中出现欺骗。根据 NHibernate 文档(https://www.hibernate.org/hib_docs/nhibernate/html/persistent-classes.html),我应该使用业务密钥相等来覆盖equals。在这种情况下,我只是不确定在比较中使用 User 的引用对象是否是一个好主意。

0 投票
3 回答
10462 浏览

c# - Object.GetHashCode

我的问题可能与 Object.GetHashCode() 的 Default implementation重复,但我再次询问,因为我不理解该问题的公认答案。

首先,我对上一个问题的已接受答案有三个问题,其中引用了一些文档,如下所示:

“但是,由于这个索引可以在垃圾回收期间回收对象后重复使用,因此有可能为两个不同的对象获取相同的哈希码。”

这是真的?在我看来,两个对象不会有相同的哈希码,因为一个对象的代码在对象被垃圾收集(即不再存在)之前不会被重用。

“此外,表示相同值的两个对象只有当它们是完全相同的对象时才具有相同的哈希码。”

这是一个问题吗?例如,我想将一些数据与 DOM 树中的每个节点实例相关联。为此,“节点”必须具有标识或哈希码,以便我可以将它们用作数据字典中的键。我想要的不是标识它是否是“完全相同的对象”,即“引用相等而不是“值相等”的哈希码吗?

“此实现对于散列不是特别有用;因此,派生类应覆盖 GetHashCode”

这是真的?如果它不适合散列,那么如果它有什么好处呢?为什么它甚至被定义为 Object 的方法?


我的最后一个(也许对我来说最重要的)问题是,如果我必须为具有“引用相等”语义的任意类型发明/覆盖 GetHashCode() 实现,那么以下是一个合理且良好的实现:


编辑

仅供参考,我使用以下代码对其进行了测试:

在我的机器上,结果/输出如下:

我的实现花费了默认实现的一半时间(但我的类型比我的 m_allocated 数据成员的大小更大)。

我的实现和默认实现都是线性扩展的。

相比之下,作为一个健全的检查,愚蠢的实现开始很糟糕并且扩展得更糟。

0 投票
4 回答
733 浏览

.net - 当空间大于 32 位时,如何实现 GetHashCode 兼容的 Equals 方法?

在 .NET 中,您需要 Equals(object) 和 GetHashCode() 兼容。但有时你不能:

因为数据密度大于 32 位,并且 GetHashCode 返回一个 Int32,所以您将有 3 个解决方案(假设正确实现了 GetHashCode):

  1. 避免代码重复 因为不正确而被丢弃

    /li>
  2. 与 GetHashCode() 分开实现 Equals

    /li>
  3. 实现精度更高的GetHashCode64,覆盖的GetHashCode(32位)会返回(int)GetHashCode64(),Equals会返回this.GetHashCode64() == other.GetHashCode64()

你会实施哪一个?

第一个解决方案不精确,但更清洁。第二个选项看起来很干净,但是当类具有更多属性时会变得非常复杂。第三种选择是妥协。

0 投票
4 回答
12981 浏览

c# - 在 C# 中创建 GetHashCode 方法

在 C# 中为类创建自己的 GetHashCode 方法的最佳方法是什么?假设我有一个简单的类(它覆盖了 Equals 方法),如下所示:

我应该使用 GetHashCode 方法的默认代码吗?

我应该基于我的课程内容的方法吗?

还是我应该做点别的?

0 投票
3 回答
975 浏览

java - .NET 等效于用于内部类型数组的 java.util.Arrays.hashCode() 函数?

对于 int[]、short[]、float[] 等内在类型的数组,是否有等效于java.util.Arrays.hashCode()的 .NET 实用程序类?

显然,我可以编写自己的实用程序类,但试图在 .NET 框架中找到一个已经可用的类。

0 投票
5 回答
5813 浏览

delphi - Converting a Double to an Integer for GetHashCode in Delphi

Delphi 2009 added the GetHashCode function to TObject. GetHashCode returns an Integer which is used for hashing in TDictionary.

If you want an object to work well in TDictionary, you need to override GetHashCode appropriately such that, in general, different objects return different integer hash codes.

But what do you do for objects containing double fields? How do you turn those double values into a integers for GetHashCode?

The way it's usually done in Java, say, is to use a method like Double.doubleToLongBits or Float.floatToIntBits. The latter has documentation that describes it as follows: "Returns a representation of the specified floating-point value according to the IEEE 754 floating-point "single format" bit layout." This involves some bitwise operations with different masks for the different bits of a floating point value.

Is there a function that does this in Delphi?

0 投票
1 回答
196 浏览

subsonic3 - 如果 int 可以为空,则 ActiveRecord 和 GetHashCode 失败

当 GetHashCode 上的 int 可以为空时会出现问题

在 ActiveRecord.tt 上的 GetHashCode 点,需要进行可空检查。像这样的东西。

(更新)这个值可以在视图上为空。我已经使用我在 inet 上找到的这段代码包含了视图。

之后,出现此错误。

0 投票
5 回答
22678 浏览

c# - 是否有完整的 IEquatable 实现参考?

我在这里关于 SO 的许多问题都与 IEquatable 实现有关。我发现它很难正确实现,因为在幼稚的实现中有很多隐藏的错误,而且我找到的关于它的文章也很不完整。我想找到或写一份明确的参考资料,其中必须包括:

  • 如何正确实现 IEquatable
  • 如何正确覆盖 Equals
  • 如何正确覆盖 GetHashCode
  • 如何正确实现 ToString 方法
  • 如何正确实现运算符 ==
  • 如何正确实现运算符 !=

这么完整的参考文献已经存在了?

PS:即使是MSDN 参考对我来说似乎也有缺陷

0 投票
4 回答
1379 浏览

c# - 我可以使用 GetHashCode 跟踪对象身份吗?

有什么用GetHashCode()?我可以使用跟踪对象身份GetHashCode()吗?如果是这样,你能举个例子吗?