java - 哈希表、哈希函数 : Difference between Value, 键、哈希值?

标签 java math hash hash-function

假设我们有想要放入哈希表中的数据。哈希函数为每个数据对象计算一个哈希值,并将该哈希值放入表中(每个值应该有自己的存储桶)。通过哈希值,我们知道数据对象在表中的确切位置。

该键在这里起什么作用? Java 中的 HashMap 需要为我们放入 HashMap 中的每个值指定一个特定的键,并且通过该键我们可以获取该值。

我想知道我们要放入哈希表(在 java Hashmap 中)的值、哈希值和键之间有什么区别?这背后的数学原理是什么?

最佳答案

你总是需要原始 key ,以应对哈希冲突。哈希码(或您所说的哈希值)的要点是能够非常快速地找到键的可能匹配。哈希码基于键 - 值完全不相关。

从逻辑上讲,从哈希表中获取的内容是:

  • 计算我们正在搜索的 key 的哈希码
  • 查找具有相同哈希码的所有条目。 (这会很快,因为我们只处理一个数字,并且我们可以安排一个数据结构,以便轻松查找具有给定哈希码的条目。这里有很多选项。)
  • 对于具有正确哈希码的每个条目,将我们正在搜索的键与条目中的键进行比较。
    • 如果现有键与我们正在搜索的键相同,则返回该条目的值
  • 没有匹配项?返回 null 以指示结果。

(哈希表划分为桶的确切方式是一个实现细节。有时每个桶仅包含一个条目,但可以链接到其他桶;在其他情况下,一个桶可以包含多个条目。请参阅 wikipedia entry on hash tables了解更多信息。)

这里的“条目”是一个{key, value, hash}元组:

  • 哈希值完全源自 key ;该值无关紧要
  • 永远不会有两个相等的键
  • 可能有多个条目具有相同的值;值(value)平等无关紧要
  • 由于哈希冲突,可能存在多个具有相同哈希值的条目;这是相关的,因为在尝试查找特定键的匹配项时需要查看更多条目

关于java - 哈希表、哈希函数 : Difference between Value, 键、哈希值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21604850/

相关文章:

用于模板类的 C++ std::tr1::hash

java - Hazelcast 中的分布式读写锁

使用 JFileChooser 进行 Java 键绑定(bind)

python - Scipy导数

php - 通过简化查询将字母拆分为组合 block

mysql - 如何从mysql上的多个表计算账单?

java - 短JSON对象的压缩方法

java - 由 : org. hibernate.MappingException : Unknown entity: New Object. JTA 引起

javascript - 如何使用 javascript/jquery 获取 iframe 的 URL 的 anchor 属性?

arrays - 如何在散列的数组中引用 Perl 散列?