最小的完美哈希函数

时间:2011-07-19 06:55:38

标签: perfect-hash

我在范围[0; 2 ^ 63-1]。但是,只有10 ^ 8个整数。 没有重复。完整列表在编译时是已知的,但它只是唯一的随机数。这些数字永远不会改变 要显式存储一个整数 ,需要8个字节,并且存在相关的1字节值,因此显式存储需要大约860 MB。
所以我想找到最小的完美哈希函数来映射从[0; 2 ^ 63-1]到[0; 10 ^ 8-1]的每个10 ^ 8个整数。我应该只找到一次这个函数,数据永远不会改变,而且函数可能很复杂。但它应该是最小的,完美的,计算应该很快。我怎么能做得更好?如果它们发生,也许有可能找到并使用一些子序列? 感谢。

2 个答案:

答案 0 :(得分:12)

让您的计算机为您完成工作:

http://www.gnu.org/software/gperf/

引用:“GNU gperf是一个完美的哈希函数生成器。对于给定的字符串列表,它以C或C ++代码的形式生成哈希函数和哈希表,用于根据输入字符串查找值。哈希函数是完美的,这意味着哈希表没有冲突,哈希表查找只需要一个字符串比较。“

答案 1 :(得分:3)

我正在处理an algorithm and Java implementation that needs less than 1.6 bits per key

以前,我已经实现了a minimal perfect hash function tool in Java,每个密钥需要少于2.0位。

其他算法在CMPH中实施。例如,CHD默认情况下每个键大约需要2.06位。它可以配置为使用更少的空间,但生成更慢。