我在范围[0; 2 ^ 63-1]。但是,只有10 ^ 8个整数。有 没有重复。完整列表在编译时是已知的,但确实如此 只是唯一的随机数。这些数字 从不改变。
存储一个整数 明确地,需要8个字节,并且有相关的1字节值,因此显式存储需要大约860 MB。
所以我想找到最小的完美哈希函数来映射从[0; 2 ^ 63-1]到[0; 10 ^ 8-1]的10 ^ 8个整数中的每一个。我应该只找到一次这个函数,数据永远不会改变,而且函数可能很复杂。但它应该是最小的,完美的,计算应该很快。我怎么能做得更好?如果它们发生,也许有可能找到并使用一些子序列?
谢谢。
让您的计算机为您完成工作:
http://www.gnu.org/software/gperf/
引用:“GNU gperf是一个完美的哈希函数生成器。对于给定的字符串列表,它以C或C ++代码的形式生成哈希函数和哈希表,用于根据输入字符串查找值。哈希函数是完美的,这意味着哈希表没有冲突,哈希表查找只需要一个字符串比较。“
我正在尝试 每个密钥需要少于1.6位的算法和Java实现。
以前,我已经实施了 Java中最小的完美哈希函数工具 每个键需要少于2.0位。
其他算法实现于 CMPH。例如,CHD默认情况下每个键大约需要2.06位。它可以配置为使用更少的空间,但生成速度更慢。