哈希键和值

时间:2015-08-19 06:28:18

标签: c++ c data-structures hash

我很好奇为什么散列需要散列键和散列值。

  1. 如果散列键是int,则将散列键更改为散列码,该散列码是散列的索引。但是,哈希值是否与哈希键相同呢?因此,当我使用int作为散列键时,不需要散列值作为参数(与散列键重复)。

  2. 如果我将哈希键作为字符串,则哈希键也会更改为哈希码。然后,哈希值是我想要与字符串匹配的一些数字? 或者是字符串的指针?

  3. 我不明白为什么需要哈希值。

1 个答案:

答案 0 :(得分:2)

让我们先看一些术语,因为你似乎对它们感到困惑 1

在散列中,实际上只有两件事,即项目(来自脚注,可能是您的散列值/键)和哈希码。您将输入项传递给散列函数并返回哈希码。这是一般情况,但请确保您已阅读脚注 - 可能有正当理由区分完整项目及其关键部分。

就你为什么需要哈希值以及代码而言,比如说,你要记录这个星球上所有超级聪明,英俊的人(以及他们的狗的名字),以及因此,您需要添加字符串paxdiablo:lilly

因此,您将该字符串抛出到哈希函数中,最终得到的哈希码为42(仅从paxdiablo计算得出),这就是它所在的桶。

但是,由于散列函数几乎总是多对一操作(许多其他字符串也会散列到42),因此根据单独的散列码,无法确定数据结构中它实际上是paxdiablo

事实上,我的主要人物paxangelo,有一只叫猫的猫,fluffybunnykins,是你可能希望不会遇到的最愚蠢,最丑陋的生命形式之一,也是生成一个42的哈希码。那么,当找到42桶中的谁时,除非原来的字符串在那里,你怎么能分辨两者之间的区别呢?

哈希码决定哪个存储桶用于某个项目,但您仍然必须项目放入存储桶中。

1 我尝试了大约十分钟,但我对我的想法并不完全满意。我可以告诉你,你正在使用:

  • 哈希值作为要存储的整个项目。
  • 散列键是用于散列的散列值的那部分。
  • 哈希值作为散列函数的结果。

我倾向于不区分前两个因为我认为没有什么可以获得的。我通常会将整个项目传递给散列函数,但是可以设想一个只需要关键部分的解决方案,尤其是如果你想在不同的记录上使用散列函数布局(键位于不同的位置)。