低熵字母数字字符串的高效散列函数

我正在尝试编写一个(完美的)哈希表,用于压缩unicode codepoint names to their codepoint number的映射(将第二列映射到第一列).正如你在那里看到的那样,可能的输入非常有限,实际上字母表中恰好有38个字符:AB … YZ,0 … 9, – 和空格.此外,还有很多(子串)重复,DIGIT ZERO,DIGIT ONE,…,LATIN CAPITAL LETTER A,LATIN CAPITAL LETTER B等.

通过选择种子S计算完美的哈希表,然后尝试构造一个完美的哈希表(以某种方式)将哈希表播种为S.如果无法创建表,则使用新种子重试.有很多冲突通常需要更多的重试,因为算法更难以使一切都适合.

这样做的结果是我的输入域具有低熵,并且表创建需要使用像DJB2这样的简单散列函数进行大量重试;像FNV这样的更好的编组器可以很好地工作,但是像SipHash这样的更复杂和更慢的功能似乎平均需要更少的重试.

由于这是完全静态和预先计算的,我不太为质量而担心质量(即运行时任意输入的安全性和概率分布无关紧要),但更高质量的功能减少了给定级别所需的预计算时间相反,压缩,允许我在一些固定的时间内实现更高的压缩.

问题:是否有高效的已发布哈希函数调整为输入域限制,如下所示?也就是说,是否存在利用额外结构来执行更少操作但仍能实现合理输出的哈希函数?

我搜索过像’字母数字哈希函数’之类的东西,但结果是无关的(大多只是生成一个字母数字字符串作为哈希函数的输出);甚至一些关于正确行话的指导,以便我可以搜索论文会有所帮助.

(这个问题的动机是稍微有点难以解决,而不是实际需要.)

最佳答案

I’m trying to write a (perfect) hash table …

如果你想要一个完美的哈希函数,我会用CMPH之类的东西生成它.这可能最终成为幕后的静态查找表.

或者你可以使用非基于哈希的方法,例如DAWG或类似Trie的结构(以及一些Aho-Corasick在顶部?).

DAWG会提供相当紧凑的存储空间并快速搜索字符串到数字.
我的预感是它可能会打破你的问题的哈希表.

有些介绍请参见http://www.wutka.com/dawg.html.有几种语言的实现.

转载注明原文:低熵字母数字字符串的高效散列函数 - 代码日志