【问题标题】:Hash key and value哈希键和值
【发布时间】:2015-11-12 07:26:43
【问题描述】:

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

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

  2. 如果我有一个哈希键作为字符串,哈希键也会更改为哈希码。然后,哈希值是我想与字符串匹配的某个数字? 还是字符串的指针?

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

【问题讨论】:

    标签: c++ c data-structures hash


    【解决方案1】:

    让我们先弄清楚一些术语,因为您似乎对它们感到困惑1

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

    就您为什么需要哈希值和代码而言,例如,假设您要记录地球上所有超级聪明、英俊的人(连同他们的狗的名字),并且因此,您需要添加字符串 paxdiablo:lilly

    因此,您将该字符串放入您的散列函数中,最终得到一个 42 的散列码(仅从 paxdiablo 计算得出),这就是它所在的存储桶。

    但是,由于散列函数几乎总是多对一操作(许多其他字符串也将散列为 42),因此仅基于散列码无法判断它实际上是您的数据结构中的 paxdiablo

    事实上,我的宿敌paxangelo,他有一只猫,名叫fluffybunnykins,是你希望不会遇到的最愚蠢、最丑陋的生命形式之一,它还会生成一个哈希码42. 那么,当谈到找出谁在 42 桶中时,除非原始字符串在其中,否则您将如何区分两者?

    哈希码决定了哪个桶用于一个项目,但您仍然必须实际项目放入桶中。


    1 我尝试了大约十分钟,但我仍然对我的想法并不完全满意。据我所知,您正在使用:

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

    我倾向于不区分前两者,因为在我看来并没有真正的收获。我通常将整个项目传递给哈希函数,但您可以设计一个只需要关键部分的解决方案,尤其是如果您想在不同的记录上使用哈希函数布局(键在不同的位置)。

    【讨论】:

    • 那么如果我想在我的哈希中找到 paxdiablo。我是否搜索哈希值..?这意味着有一些空间说 paxdiablo == 哈希值是这样的吗?
    • @양수현,如果你想找到paxdiablo,你对字符串进行哈希处理得到42,然后去#42桶并翻遍所有条目直到找到它(或者没有,如情况可能是)。
    • 当我搜索 paxdiablo 时,我仍然不确定哈希值。那么是哈希值paxdiablo..?
    猜你喜欢
    • 2021-12-15
    • 1970-01-01
    • 1970-01-01
    • 2022-12-24
    • 1970-01-01
    • 1970-01-01
    • 2011-06-30
    • 2021-12-30
    相关资源
    最近更新 更多