Hash 皮尔逊完全散列

Hash 皮尔逊完全散列,hash,perfect-hash,Hash,Perfect Hash,我正在尝试编写一个生成皮尔逊完美散列的生成器。注意,我不需要最小的完美散列。维基百科说,皮尔逊完美散列可以使用随机算法(其中S是一组键)在O(| S |)时间内找到。然而,我还没有在网上找到这样的算法。这可能吗 注意:我不想使用gperf/cmph/等,我宁愿编写自己的实现。Pearson概述了一种算法,用于构造一个置换表t以实现完美的哈希: 这个新的哈希函数的核心表T有时可以修改,以便在一个适当的单词列表上生成一个最小的、完美的哈希函数。事实上,人们通常可以为特定单词选择函数的确切值。例如,K

我正在尝试编写一个生成皮尔逊完美散列的生成器。注意,我不需要最小的完美散列。维基百科说,皮尔逊完美散列可以使用随机算法(其中S是一组键)在O(| S |)时间内找到。然而,我还没有在网上找到这样的算法。这可能吗

注意:我不想使用gperf/cmph/等,我宁愿编写自己的实现。

Pearson概述了一种算法,用于构造一个置换表t以实现完美的哈希:

这个新的哈希函数的核心表T有时可以修改,以便在一个适当的单词列表上生成一个最小的、完美的哈希函数。事实上,人们通常可以为特定单词选择函数的确切值。例如,Knuth[3]用一种算法演示了完美哈希,该算法将31个常见英语单词的列表映射到两个单词之间的唯一整数−10和30。表II中的表T将这些相同的31个单词按字母顺序映射到1到31之间的整数上

尽管表II中表格的构建过程过于复杂,无法在此详述,但以下重点内容将使感兴趣的读者能够重复该过程:

  • 表T由整数(0…255)的伪随机排列构成
  • 一个接一个地,所需的值被分配给列表中的单词。每个作业都是通过交换表中的两个元素来完成的
  • 对于每个单词,考虑交换的第一个候选词是T[h[n]− 1] ⊕ C[n]],计算该字的哈希函数时引用的最后一个表元素
  • 如果表元素在对以前分配的单词进行哈希运算时被引用,或者在对同一单词进行哈希运算时被引用,则无法交换该表元素
  • 如果规则4禁止进行必要的交换,则将注意力转移到先前引用的表元素T[h[n]上− 2] ⊕ C[n− 1] 】
  • 这个过程并不总是成功的。例如,使用ASCII字符码,如果单词“a”散列为0,单词“i”散列为15,那么单词“in”必须散列为0。最初尝试将Knuth的31个字映射到整数(0…30)上失败的原因正是这个。转移到范围(1…31)是一种特殊的策略来避免这个问题

    对T的篡改是否会破坏哈希函数的统计行为?不严重。当26662个字典条目散列到256个存储箱中时,结果分布仍然与均匀分布没有显著差异(χ²=266.03255 d.f.,p=0.30)。对128个随机选择的字典单词进行散列,平均产生27.5次冲突,而未修改的T为26.8次。当如上所述扩展此函数以产生16位散列索引时,相同的测试产生的冲突数量显著增加(4870次,未修改的T为4721次),尽管分布仍然与均匀分布没有显著差异(χ²=565.2532 d.f.,p=0.154)

    Pearson’s概述了一种构造置换表T以实现完美散列的算法:

    这个新的哈希函数的核心表T有时可以修改,以便在一个适当的单词列表上生成一个最小的、完美的哈希函数。事实上,人们通常可以为特定单词选择函数的确切值。例如,Knuth[3]用一种算法演示了完美哈希,该算法将31个常见英语单词的列表映射到两个单词之间的唯一整数−10和30。表II中的表T将这些相同的31个单词按字母顺序映射到1到31之间的整数上

    尽管表II中表格的构建过程过于复杂,无法在此详述,但以下重点内容将使感兴趣的读者能够重复该过程:

  • 表T由整数(0…255)的伪随机排列构成
  • 一个接一个地,所需的值被分配给列表中的单词。每个作业都是通过交换表中的两个元素来完成的
  • 对于每个单词,考虑交换的第一个候选词是T[h[n]− 1] ⊕ C[n]],计算该字的哈希函数时引用的最后一个表元素
  • 如果表元素在对以前分配的单词进行哈希运算时被引用,或者在对同一单词进行哈希运算时被引用,则无法交换该表元素
  • 如果规则4禁止进行必要的交换,则将注意力转移到先前引用的表元素T[h[n]上− 2] ⊕ C[n− 1] 】
  • 这个过程并不总是成功的。例如,使用ASCII字符码,如果单词“a”散列为0,单词“i”散列为15,那么单词“in”必须散列为0。最初尝试将Knuth的31个字映射到整数(0…30)上失败的原因正是这个。转移到范围(1…31)是一种特殊的策略来避免这个问题

    对T的篡改是否会破坏哈希函数的统计行为?不严重。当26662个字典条目散列到256个存储箱中时,结果分布仍然与均匀分布没有显著差异(χ²=266.03255 d.f.,p=0.30)。对128个随机选择的字典单词进行散列,平均产生27.5次冲突,而未修改的T为26.8次。当如上所述扩展此函数以产生16位散列索引时,相同的测试产生的冲突数量显著增加(4870次,未修改的T为4721次),尽管分布仍然与均匀分布没有显著差异(χ²=565.2532 d.f.,p=0.154)