【问题标题】:Is Universal family of hash functions only to prevent enemy attack?通用哈希函数家族只是为了防止敌人攻击吗?
【发布时间】:2016-05-16 05:33:05
【问题描述】:

如果我的意图只是有一个好的散列函数将数据均匀分布到所有存储桶中,那么我不需要提出一系列散列函数,我可以只使用一个好的散列函数,对吗? ?

拥有一系列散列函数的目的只是为了让敌人更难建立一个病态数据集,因为当我们随机选择一个散列函数时,他/她不知道使用哪个散列函数。我的理解对吗?

编辑: 由于有人试图关闭不清楚;这个问题是为了了解使用通用哈希函数家族的真正目的。

【问题讨论】:

    标签: data-structures hash hashtable universal-hashing


    【解决方案1】:

    我可以只用一个好的哈希函数,对吗?

    正如您稍后在问题中所指出的,知道您正在使用哪个哈希函数的“敌人”可以准备一个病态数据集。

    此外,散列只是将数据存储到表的存储桶中的第一阶段 - 如果您正在实施开放寻址/封闭散列,您还需要选择替代存储桶以在冲突后进行探测:通常是线性和二次探测等简单方法提供足够的碰撞避免,并且可能在数学上更简单,因此比重新散列更快,但它们不保持下一个探测器在负载因子下找到未使用的桶的概率。使用另一个散列函数(包括此类函数系列中的另一个)进行重新散列,因此如果这对您很重要,您可能更喜欢使用散列函数系列。

    还要注意,有时内存中的哈希表用于说明磁盘数据上的哪些偏移量/扇区存储,因此使用已在内存中的数据进行额外的重新哈希计算可能比更高的概率(使用线性/二次探测)等待磁盘 I/O 才发现另一个冲突。

    【讨论】:

    • 我明白你在说什么,但我认为我们在这里混淆了两件事。一种是双重哈希查找探测序列,另一种是通用哈希函数族。据我了解,这是两件不同的事情。为简单起见,让我们使用链式作为解决冲突的手段,现在,如果我不担心敌人的攻击,我不必费心实现一个通用的哈希函数系列,对吗?我可以选择一个好的散列函数并将其用于我的实现,对吗?
    • @Aravind:您确实可以在没有通用哈希函数系列的情况下进行 双重哈希:引用 Wikipedia "...哈希函数 h1 和 h2,哈希表 T 中值 k 在桶序列中的第 i 个位置是:h(i,k)=(h1(k) + i * h2(k)) mod |T|。" - 仅使用两个哈希函数。尽管如此,维基百科继续“通常,h_1 和 h_2 是从一组通用哈希函数中选择的。”。对于每个连续的探测,也可以使用该系列中的不同哈希函数,而不是典型的双重哈希 i * h2(k)
    • 无论如何,我的观点确实是这样的哈希函数家族可以提供不同的冲突倾向,即使在没有“敌人”的情况下,您也可能在意试图引起碰撞。如果您对可预测的冲突后开放寻址既没有特殊需求,也没有敌人,我想不出另一个理由来使用通用哈希函数系列。在不具备“网络攻击能力”的日常软件中需要它们是例外,而不是规则。
    • 好的!不过我有一个问题:“对于每个连续的探测,也可以使用家族中不同的哈希函数,而不是 i * h2(k) 典型的双重哈希。”。每个连续探测的不同哈希函数?我认为哈希函数是在开始使用哈希表时随机选择的。我在哪里可以阅读更多关于这种为每个探测选择随机散列函数的方法的信息?用于特定探针的函数如何存储以供以后查找键?
    • @Aravind: " 我认为哈希函数是在开始使用哈希表时随机选取的。" - 为了避免恶意攻击,它们可以是,或者例如随机化散列函数并因此随机化迭代顺序,因此错误地假设该顺序的代码更有可能提前失败(希望在测试中)。也就是说,即使 随机选择任何哈希函数系列,您也可以使用哈希函数系列:您可以从 h(key) 开始,如果发生冲突,请尝试 h'(key),然后是 h''(key) 等等 -其中 h/h'/h'' 是连续的家庭成员,直到找到未使用的存储桶。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-06-29
    • 1970-01-01
    • 2016-04-30
    • 2021-08-09
    • 2011-03-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多