已知字符串的近乎完美的哈希值

时间:2014-07-11 19:13:41

标签: string algorithm hash

给定一组125,000个字符串,表大小为250,000(因此加载因子.5),并且假设这些字符串永远不会改变,找到更好的散列函数的好过程是什么?

字符串长度为1-59个字符,包含72个唯一字符(典型的ascii值),平均长度和中位数长度为7个字符。

到目前为止尝试过的方法(哈希总是最终mod表大小)

  • (由某人建议)md5与线性探测(48)
  • Python内置哈希(每次搜索最多40个探测)
  • 使用二次探测的自定义哈希(25)
  • 具有素数系数的多项式,具有不同素数系数的双重哈希,搜索素数1-1000以获得最佳对(13)
  • 执行前5个探测深度,然后生成一个大小为256的数组,其中包含表中剩余的最大连续可用空间块,然后使用那些带有线性探测的mod 256(11)
  • Cuckoo散列有三个独立的散列函数,但没有找到散列函数的任意组合以避免无限循环

鉴于加载因子是.5,哈希函数的工作效果是否存在理论上的限制?如果没有非常庞大的额外查找表,它会不会是完美的?

我已经读过最小的完美散列需要~1.6位/密钥,当前最佳结果是~2.5位/密钥。但这是最小的(表大小=#键)。当然,在我的情况下,如果不是完美的话,我们可以用非常小的查找表来完美地完成它?

顺便说一下,散列函数的速度在这种情况下并不重要。

1 个答案:

答案 0 :(得分:3)

您是否考虑过使用两个独立的哈希函数?布谷鸟散列的变体可以使用仅两个散列函数来构建具有令人惊讶的高负载因子的散列表。

未修改的布谷鸟散列(每个项目散列到其两个位置中的一个)以恒定概率获得.5的加载因子。如果你修改它以使用大小为2的桶(因此每个项目哈希到两个桶中的一个,所以四个位置中的一个,并且你逐出桶的最旧元素),我相信你可以获得大约0.8或0.9的负载因子没有不合理的长期最坏情况插入时间。

在您提出的问题中,从字符串到表格单元格有250000 ^ 125000种可能的映射。 250000 * 249999 * ... * 125001是单射的(“完美哈希函数”)。使用斯特林近似后一个数字;根据这两个数字的日志差异,您会发现随机选择的函数将是一个完美的散列,概率约为2 ^( - 55000)。意味着(具有惊人的高概率)存在一个55千比特的表,它指定了一个完美的散列函数,其大小“仅”55千比特,而且没有任何实质上更小的东西。 (找到这个表是另一回事。另外,请注意,这种信息理论方法假设没有进行任何探测。)