1

我知道合同说“如果两个对象相等,那么它们应该返回相同的哈希码”。那是为了让那些对象可以被放置在同一个哈希桶中并且改进哈希码相关的收集函数知道。再说一遍为什么它说“如果两个对象具有相同的哈希码,那么它们不应该总是相等”。我的意思是,如果在合同中是真的,我们应该说“如果两个对象相等,它们可能会返回相同的哈希码,但这不是强制性的”

4

5 回答 5

6

我的意思是,如果在合同中是真的,我们应该说“如果两个对象相等,它们可能会返回相同的哈希码,但这不是强制性的”

不,不应该。这是因为,每当在 aHashMap或 a中搜索一个对象时HashSet,首先会根据hashCode(注意 : - hashCode()不用于在ArrayList或的情况下进行搜索LinkedList。它们不是hash based集合),然后如果两个对象具有相同的哈希码,它移动到equals比较对象本身的方法。

现在假设如果上述陈述为真,那么对于这些​​对象,第一个测试本身将失败。也就是说,如果允许两个相等的对象具有不同的 hashcode,那么在搜索特定的 hashCode 时,它​​不会返回正确的结果,因此测试将不会继续equals method,并声明这些对象是unequal即使你期望的他们是平等的。

现在让我们转到第二个语句:-

如果两个对象具有相同的哈希码,则它们不应该总是相等”

让我们这样理解: - 由于hashCode为每个对象生成的类型都是int,因此您可以生成最大2 ^ 32唯一性hashcodes。所以,想象一下如果你想存储更多的对象会发生什么。在这种情况下,必须有一个collison。因此,除了将相同分配给两个不同的对象two different objects之外,您别无他法。hashCodes因此,上述说法是有道理的。


因此,从上面的解释中可以清楚地看出两件事:-

  • 两个相同的对象必须具有相同的 hashCode。
  • 两个不同的对象可以有相同的 hashCodes。

以下链接中有关此主题的更多详细信息(没有比这更好的解释了):-

于 2012-11-26T17:52:34.513 回答
5

没有。文档是正确的,你搞混了。

  • 两个相等的对象必须具有相同的哈希码。
  • 具有相同哈希码的两个对象可能不相等。
  • 为了哈希表的性能,您通常希望两个 相等的对象尽可能多地具有不同的哈希码。

例如,以下始终是 的有效实现hashCode()

public int hashCode() { 
  return 0;
  // clearly all equal objects have the same hash code -- 0
  // but it's totally okay that unequal objects also have the same hash code
}
于 2012-11-26T17:49:48.657 回答
2

每个桶HashMap可以存储多个条目,选择哪个桶取决于哈希码。通过使用来标识存储桶,然后在该存储桶中查找匹配HashMap的键,查找键的条目。hashcode()equals()

鉴于上述情况,应该清楚您可以毫无问题地重复哈希码(如果多个对象具有相同的哈希码但一切仍然有效,则会影响 HashMaps的性能)

于 2012-11-26T17:51:24.197 回答
0

如果 2 个相同的哈希码必须来自同一个对象,那么哈希就不会那么安全。从技术上讲,根据哈希计算密码是什么是可能的。这会破坏哈希码的目的(至少在安全意义上)。

对于非安全散列,如果您可以让每个唯一值生成唯一散列,那么您将解决未解决的计算问题。

于 2012-11-26T17:50:39.623 回答
0

哈希函数通常是

单向函数

:一些输入值(对象)可能会产生相同的哈希码。

于 2012-11-26T17:51:49.893 回答