当前位置: 首页 > 知识库问答 >
问题:

具有单个字段的包装类的哈希代码

黄凌龙
2023-03-14

我有一个包装类,它只有一个字段,我想覆盖包装类的GetHashCode方法。

我曾在有多个字段的情况下编写过哈希代码算法(即使用xor、shift和wrap等),但这是我第一次只使用单个字段。

1)包装器和它的字段应该返回相同的哈希代码吗?我最初的想法是不,我们故意设计一个生成与另一个类相同散列的类,这感觉不太对。

2)如果没有,取字段的hashcode加1就足够了吗,或者有没有更好的方法来计算新的hashcode?field类本身有一个很好的算法来生成它的哈希代码。

共有1个答案

燕宜修
2023-03-14

正如您可能意识到的那样,当您想要为类型定制默认的相等行为时,您应该重写< code>GetHashCode()和< code>Equals(),这在各种上下文中使用,但包括基于散列表的数据结构,如< code>HashSet

执行此操作时需要遵循一些一般规则(最重要的是,如果您的类型的两个实例相等,它们必须具有相同的哈希码值),但这些规则都不涉及担心哈希值是否可能与其他类型的实例的值重合。事实上,如果哈希值与相同类型的实例的值重合,这甚至不一定是问题。由于GetHashCode()返回32位整数,因此只有可能值不超过2^32的类型甚至可以保证相同类型实例的唯一哈希值(例如intbool等)。

例如,对于任何给定的long值(64位整数),有2^32-1个其他long值具有相同的哈希码。

这是一个很长的说法...简单的实现只是作为其 GetHashCode() 方法的您自己的类型值返回,即单个字段的 GetHashCode() 方法返回的值,是实现 GetHashCode() 方法的一种完全可接受且有用的方法。

确实,如果由于某种原因,在同一个数据结构中有一个包含对象类型的实例和你自己的对象类型的实例,就会发生冲突(即两个不同的实例具有相同的哈希码值)。但是因为在处理哈希码时无论如何都会发生冲突,所以这不是问题。

 类似资料:
  • 问题内容: 我有三个领域,即 1号 2号 时间 我试图在Java中编写一个函数,为上述字段返回唯一的哈希值( 长期需要是hash的返回类型 )。然后,此哈希将用于在HashSet中存储与上述字段相对应的数据库行。我是编写哈希码函数的新手,有人可以复习一下我的内容。 问题答案: 我认为这是hashCode的特殊版本。否则,您将需要覆盖,不要定义新方法。诸如此类的容器不会获得您自己的哈希码。 因此,对

  • 我还将列表一中的和成员的每个哈希代码与列表二中成员的哈希代码进行了比较。而且没有区别。但是如果我比较完整列表的hashcode,就有区别了。我不知道为什么。我很无助。 也许有人能帮我。请提前向我致以最诚挚的问候和感谢。

  • 我可以有一个哈希图在Java看起来像这样吗? 我的问题和这里的类似问题 我是Java新手。所以我想知道的是,如果我需要上面这样的东西,如果它无效,什么是最好的数据结构?

  • 我只看到两种方法: 将所有字段设置为受保护(或包可见性) 为所有字段生成50个getter 创建50个委托方法来获取这些字段的状态,而不是整个对象的状态 在正常情况下,我会选择最后一个(尽管我真的不想仅仅出于测试的原因而改变界面)。但是在我的类中编写50个新方法只是为了测试真的有意义吗?在这种情况下,将字段设置为受保护的不是更好吗,因为有这么多方法,类会变得不清楚? 注意。反射是我想使用的最后一个

  • 我试图故意制造碰撞。 所以,我有和对象。我已经覆盖了Country的和方法,以便: india.hash代码()==india2.hash代码() 根据JavaHashMap中的冲突解决方案和文章“让这个国家对象在hashmap中”的一部分,如果key1的结果等于key2上的相同操作,那么应该会有冲突。 所以,我放置断点来查看的内容,并查看它的是2。也就是说,它包含两个不同的条目,并且没有link

  • 问题内容: 我正在阅读Joshua Bloch撰写的Effective Java 项目15 。在第15项中,谈到“最小化可变性”时,他提到了使对象不可变的五个规则。其中之一是使所有字段最终确定。这是规则: 将所有字段都设为最终字段 :这可以通过系统强制地表达您的意图。同样,如果对新创建实例的引用从一个线程传递到另一个线程而没有同步,则必须确保正确的行为,如在内存模型中阐明的那样[JLS,17.5;