【问题标题】:Does Java hashCode method do both conversion and compression?Java hashCode 方法是否同时进行转换和压缩?
【发布时间】:2023-03-30 23:22:01
【问题描述】:

换句话说,hashCode() 返回的整数是否已经是哈希表条目的索引,还是必须通过将自身压缩为索引(可能通过修改表长度)更进一步?

【问题讨论】:

  • 没有。哈希表的存储桶几乎总是比 2^32 少得多。 JDK 源代码随 JDK 一起提供。为什么不阅读源代码(甚至只是文档)?
  • 考虑到您可以将同一个对象放入两个(或多个)不同大小(或零个哈希表)的哈希表中,您认为hashCode 方法会返回哪个表的索引?

标签: java hash hashmap hashcode hash-function


【解决方案1】:

不,无论目标哈希表如何,都会计算哈希码。例如,整数的哈希码就是整数本身,因此哈希表通常需要再次进行 mod 哈希以将其放入表中。

【讨论】:

  • 那么hashCode方法似乎不能保证无冲突,因为来自两个不同对象的两个哈希码可能被压缩到同一个表索引(例如hashcode1 = 7,hashcode2 = 14,tableLength = 7,所以 idx1 = idx2 = 0)。如果是这样,哈希码的意义何在?
  • 使碰撞不可能,或至少尽可能地不可能。每个哈希表实现都必须处理冲突,您只需尝试减少它们。
  • @OneFlowerOneWorld 此外,您似乎认为 hashCodes 是独一无二的。事实并非如此。许多对象具有相同的 hashCode。
  • @OneFlowerOneWorld 有 2^64 个不同的 Long 值,但只有 2^32 个可能的哈希码。肯定会发生碰撞。
  • @JBNizet 我想我在这里更困惑了。那么hashCode() 是做什么用的?如何使我自己的类的对象能够用作HashMap 键?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多