我正在尝试编写一个(完美的)哈希表来压缩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似乎需要更少的重试次数。
由于这是完全静态和预先计算的,我不太为质量而担心质量(即运行时任意输入的安全性和概率分布无关紧要),但更高质量的功能减少了所需的预计算时间。相反,给定的压缩水平允许我在某个固定的时间内实现更高的压缩。
问题:是否有高效的已发布哈希函数调整为输入这样的域约束?也就是说,是否存在利用额外结构进行较少操作但仍能实现合理输出的哈希函数?
我搜索了'字母数字哈希函数'之类的东西,但结果是无关的(主要是生成一个字母数字字符串作为哈希函数的输出);甚至一些关于正确行话的指导,以便我可以搜索论文会有所帮助。
(这个问题的动机是解决一些问题,而不是实际需要。)
答案 0 :(得分:0)
我正在尝试编写一个(完美的)哈希表...
如果你想要一个完美的哈希函数,我会用CMPH之类的东西生成它。这可能最终成为幕后的静态查找表。
或者你可以使用非基于哈希的方法,例如DAWG或类似Trie的结构(以及顶部的一些Aho-Corasick)。
DAWG会提供相当紧凑的存储空间并快速搜索字符串到数字。 我的预感是它可能会打破你的问题的哈希表。
有关简介,请参阅http://www.wutka.com/dawg.html。有几种语言的实现。