假设我们有想要放入哈希表中的数据。哈希函数为每个数据对象计算一个哈希值,并将该哈希值放入表中(每个值应该有自己的存储桶)。通过哈希值,我们知道数据对象在表中的确切位置。
该键在这里起什么作用? 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/