我很好奇为什么散列需要散列键和散列值。
如果散列键是int,则将散列键更改为散列码,该散列码是散列的索引。但是,哈希值是否与哈希键相同呢?因此,当我使用int作为散列键时,不需要散列值作为参数(与散列键重复)。
如果我将哈希键作为字符串,则哈希键也会更改为哈希码。然后,哈希值是我想要与字符串匹配的一些数字? 或者是字符串的指针?
我不明白为什么需要哈希值。
答案 0 :(得分:2)
让我们先看一些术语,因为你似乎对它们感到困惑 1 。
在散列中,实际上只有两件事,即项目(来自脚注,可能是您的散列值/键)和哈希码。您将输入项传递给散列函数并返回哈希码。这是一般情况,但请确保您已阅读脚注 - 可能有正当理由区分完整项目及其关键部分。
就你为什么需要哈希值以及代码而言,比如说,你要记录这个星球上所有超级聪明,英俊的人(以及他们的狗的名字),以及因此,您需要添加字符串paxdiablo:lilly
。
因此,您将该字符串抛出到哈希函数中,最终得到的哈希码为42(仅从paxdiablo
计算得出),这就是它所在的桶。
但是,由于散列函数几乎总是多对一操作(许多其他字符串也会散列到42),因此根据单独的散列码,无法确定数据结构中它实际上是paxdiablo
事实上,我的主要人物paxangelo
,有一只叫猫的猫,fluffybunnykins
,是你可能希望不会遇到的最愚蠢,最丑陋的生命形式之一,也是生成一个42的哈希码。那么,当找到42桶中的谁时,除非原来的字符串在那里,你怎么能分辨两者之间的区别呢?
哈希码决定哪个存储桶用于某个项目,但您仍然必须将项目放入存储桶中。
1 我尝试了大约十分钟,但我仍对我的想法并不完全满意。我可以告诉你,你正在使用:
我倾向于不区分前两个因为我认为没有什么可以获得的。我通常会将整个项目传递给散列函数,但是可以设想一个只需要关键部分的解决方案,尤其是如果你想在不同的记录上使用散列函数布局(键位于不同的位置)。