Java 哈希表,哈希函数:值,键,哈希值之间的差异?

Java 哈希表,哈希函数:值,键,哈希值之间的差异?,java,math,hash,hash-function,Java,Math,Hash,Hash Function,假设我们有数据要放在哈希表中。Hashfunction为每个数据对象计算一个Hashvalue,并将这个Hashvalue放入一个表中(每个值都应该有自己的bucket)。通过hashvalue,我们知道数据对象在表中的确切位置 钥匙在这里扮演什么角色?Java中的HashMap需要为我们输入到HashMap中的每个值指定一个特定的键,通过该键我们可以获得值 我想知道我们想要放入哈希表(在java Hashmap中)的值、hashvalue和键之间有什么区别?这背后的数学原理是什么?您始终需要使

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

钥匙在这里扮演什么角色?Java中的HashMap需要为我们输入到HashMap中的每个值指定一个特定的键,通过该键我们可以获得值


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

您始终需要使用原始密钥来处理哈希冲突。哈希代码(或您正在调用的哈希值)的要点是能够非常快速地找到密钥的可能匹配项。哈希代码完全基于键-值完全无关

因此,从逻辑上讲,从哈希表获取是:

  • 计算我们正在搜索的密钥的哈希代码
  • 查找具有相同哈希代码的所有条目。(这会很快,因为我们只需要处理一个数字,我们可以安排一个数据结构,这样就很容易找到具有给定哈希代码的条目。这里有很多选项。)
  • 对于每个具有正确哈希代码的条目,将搜索的密钥与条目中的密钥进行比较。
    • 如果现有键和我们正在搜索的键相等,则返回该项的值
  • 没有火柴?返回
    null
    以指示该结果
(哈希表划分为存储桶的确切方式是一个实现细节。有时每个存储桶只包含一个条目,但可以链接到其他存储桶;在其他情况下,一个存储桶可以包含多个条目。有关详细信息,请参阅。)

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

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

看一看。
每个值都应该有自己的bucket
——bucket这个词本身应该已经是一个强烈的提示,表明这不是真的。
将这个hashvalues放入一个表中
——错误。它将密钥放入由散列值寻址的存储桶中。许多散列值都指向同一个bucket。每个值都没有自己的bucket。每个条目都存储在一个bucket中,bucket是根据密钥的散列来选择的,通常是散列的一个mod(尽管是polygene,但它不仅仅是mod)。这些评论,或者Jon skeet的回答,都没有解决海报上似乎存在的特定问题:散列值是从密钥计算出来的,并且仅是密钥。计算中没有用到这个值,我有疑问。“查找具有相同哈希代码的所有条目”-输入时相同的哈希代码将导致冲突。所以,如果使用一些冲突解决技术,比如链表,我们会得到多个条目还是一个?@techG:many。条目由{key,value,hash}组成。多个条目可以具有相同的散列,许多条目可以具有相同的值(甚至不容易检测到),但对于特定的密钥,只有一个条目。