Data structures 通用哈希函数族只是为了防止敌人的攻击吗?

Data structures 通用哈希函数族只是为了防止敌人的攻击吗?,data-structures,hash,hashtable,universal-hashing,Data Structures,Hash,Hashtable,Universal Hashing,如果我的目的只是要有一个好的散列函数,将数据均匀地分布到所有的存储桶中,那么我不需要提出一系列散列函数,我只需要一个好的散列函数,对吗 拥有一系列散列函数的目的只是让敌人更难建立病理数据集,因为当我们随机选择一个散列函数时,他/她不知道使用哪个散列函数。我的理解正确吗 编辑: 因为有人试图接近,所以不清楚;这个问题是为了了解使用一个通用哈希函数族的真正目的 我只需要一个好的散列函数,对吗 正如您在后面的问题中注意到的,一个知道您正在使用哪个散列函数的“敌人”可以准备一个病理数据集 此外,散列只是

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

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

编辑: 因为有人试图接近,所以不清楚;这个问题是为了了解使用一个通用哈希函数族的真正目的

我只需要一个好的散列函数,对吗

正如您在后面的问题中注意到的,一个知道您正在使用哪个散列函数的“敌人”可以准备一个病理数据集

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

还要注意的是,有时使用内存中的哈希表来表示磁盘数据上的偏移量/扇区的存储位置,因此使用内存中已有的数据进行额外的重新灰化计算可能比等待磁盘I/O只发现另一个冲突的更高概率(使用线性/二次探测)更具吸引力

我只需要一个好的散列函数,对吗

正如您在后面的问题中注意到的,一个知道您正在使用哪个散列函数的“敌人”可以准备一个病理数据集

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


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

我明白你的意思,但我认为我们混淆了两件事。一种是双哈希法来查找探测序列,另一种是通用的哈希函数族。根据我的理解,这是两件不同的事情。为了简单起见,让我们使用链锁作为冲突解决的手段,现在,如果我不担心敌人的攻击,我就不必麻烦实现一个通用的哈希函数族,对吗?我可以选择一个好的散列函数并将其用于我的实现,对吗?@Aravind:您确实可以在没有通用散列函数族的情况下进行双重散列:引用“…散列函数h1和h2,散列表T中值k在桶序列中的第I个位置是:h(I,k)=(h1(k)+I*h2(k))mod|T |”-仅使用两个哈希函数。尽管如此,Wikipedia继续说“通常,h_1和h_2是从一组通用哈希函数中选择的。”。也可以为每个后续探测使用不同的哈希函数,而不是典型的双哈希i*h2(k)。无论如何,我的观点是,这样的哈希函数族可以提供不同的冲突倾向性,即使在没有“敌人”试图引起冲突的情况下,您也可能会关心。如果您对可预测的冲突后开放寻址既没有特殊需求,也没有敌人,那么我想不出另外一个跳转到通用哈希函数族的理由。在日常软件中需要它们而不是“网络攻击鲁棒性”是例外,而不是规则。好吧!不过我有一个问题:“对于每个连续的探测,也可以使用家族中不同的散列函数,而不是典型的双散列I*h2(k)。”。每个后续探测的不同哈希函数?我认为哈希函数是在开始使用哈希表时随机选取的。我在哪里可以读到更多关于为每个探测选择随机散列函数的方法的信息?用于特定探测的函数是如何在以后存储以查找键的?@Aravind:“我认为哈希函数是在使用哈希表的开始时随机选取的。”-它们可以是,以避免恶意攻击,或者例如,随机选择哈希函数,从而确定迭代顺序,因此,错误地假设该顺序的代码更可能在早期失败(希望在测试中)。也就是说,即使不随机选择哈希函数族,也可以使用它们:您可以从
h(key)
开始,如果发生冲突,请尝试
h'(key)
,然后尝试
h'(key)
等,其中h/h'/h''是连续的族成员,直到找到一个未使用的bucket。我明白您的意思,但我认为我们混淆了两件事。一种是双哈希法来查找探测序列,另一种是通用的哈希函数族。据我了解