2

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

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

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

4

1 回答 1

3

您总是需要原始密钥来应对哈希冲突。哈希码(或您所称的哈希值)的重点是能够非常快速地找到键的可能匹配项。哈希码完全基于键 - 值完全不相关。

所以从逻辑上讲,从哈希表中获取是:

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

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

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

  • 哈希完全来自密钥;价值无关紧要
  • 永远不会有两个相等的键
  • 可能有多个具有相同值的条目;价值平等无关紧要
  • 由于哈希冲突,可能存在多个具有相同哈希的条目;这是相关的,因为在尝试查找特定键的匹配项时需要查看更多条目
于 2014-02-06T13:56:39.407 回答