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

亨利

给定一组125,000个字符串,表大小为250,000个(因此负载因子.5),并且考虑到这些字符串永不更改,那么寻找更好的哈希函数的好方法是什么?

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

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

  • (由某人建议)带有线性探测的md5(48)
  • Python内置哈希(每个搜索最多40个探针)
  • 具有二次探测的自定义哈希(25)
  • 具有素数系数的多项式,具有不同素数系数的双哈希,搜索素数1-1000以获取最佳对(13)
  • 进行前5个探针深处,然后生成大小为256的数组,其中包含表中剩余的最大连续可用块,然后将这些mod 256与线性探测一起使用(11)
  • 带有三个独立哈希函数的布谷鸟哈希,但是尚未找到哈希函数的任何组合来避免无限循环

假设负载因子为.5,那么散列函数的工作方式是否有理论上的限制?如果没有非常庞大的附加查询表,它会完美吗?

我已经读到最小的完美散列需要〜1.6位/密钥,而当前的最佳结果是〜2.5位/密钥。但这是最小的(表大小=#键)。当然,在我的情况下,通过很小的查询表,我们可以非常接近完美(如果不是完美的话)?

哈希函数的速度在这种情况下并不重要。

Tmyklebu

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

未经修改的布谷鸟哈希(每个项目都精确哈希到其两个位置之一)以恒定的概率达到0.5的负载系数。如果您修改它以使用大小为2的存储桶(因此每个项目都散列为两个存储桶之一,因此是四个位置之一,并且逐出存储桶中最古老的元素),我相信您可以获得的负载系数约为0.8或0.9没有不合理的长时间最坏情况插入时间。

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

无法在Android中将位图转换为完美的Base64字符串?

来自分类Dev

为什么sqlalchemy将\添加到“以便将一个完美的JSON字符串添加到postgresql json字段?

来自分类Dev

基本的字符串哈希/去哈希

来自分类Dev

字符串的快速哈希

来自分类Dev

字符串比较与哈希

来自分类Dev

删除字符串 Java 的已知部分

来自分类Dev

已知字符串的正则表达式+混合varchar +已知字符串

来自分类Dev

PHP替换已知长度但未知字符的字符串

来自分类Dev

使用data.table的字符串匹配不完美

来自分类Dev

保存Redis哈希而不是字符串

来自分类Dev

从json字符串加载的哈希键

来自分类Dev

将字符串转换为哈希

来自分类Dev

字符串的Base62哈希

来自分类Dev

字符串的持久哈希码

来自分类Dev

如何防止哈希转义字符串?

来自分类Dev

将字符串解析为哈希

来自分类Dev

JSON解析哈希数组的字符串

来自分类Dev

Ruby字符串数组进行哈希

来自分类Dev

反转字符串哈希函数

来自分类Dev

解析字符串以在Ruby中哈希

来自分类Dev

字符串哈希表实现

来自分类Dev

字符串的Base62哈希

来自分类Dev

如何用哈希解析字符串?

来自分类Dev

Powershell-从哈希到字符串

来自分类Dev

按键(字符串)对哈希进行排序

来自分类Dev

parseInt() 字符串哈希返回整数

来自分类Dev

创建字符串的数字哈希。爪哇

来自分类Dev

将字符串转换为哈希

来自分类Dev

哈希表 C++ 字符串