假设我有一些已知值,我想针对这些值创建一个哈希表。例如,

For 0x78409 -> 1
For 0x89934 -> 2
For 0x89834 -> 3

等等...

但是这些值 (0x78409, 0x89934, 0x89834) 只在运行时才知道,所以不能使用 switch/case。然而,它们在执行开始时就被知道了,所以也许我们可以创建一个哈希函数,它可以适应自己来制作一个完美的哈希表。所以我的问题是,我们能否为这种情况创建一个完美的哈希函数。

最佳答案

如果在创建 hashmap 之前就知道整个输入域,那么这是可能的,但需要某种形式的运行时代码生成,通过 VM 或 JIT(可能通过脚本语言,例如 LuaJIT),这将允许您使用 gperf 和它的同类在运行时创建一个散列,编译它,然后用它来填充和从 map 中检索。

一个更简单、更可行的解决方案是对给定的一组输入排列使用具有极低冲突的散列函数(例如:您可能只使用字母、小写字符),一个最小的完美散列。

Murmur3 和 crapwow 是需要注意的(不过,我对 crapwow 持谨慎态度),Google's CityHashxxHash 也值得一看。 Bob Jenkins 也有一个很好的基于最小完美哈希的 map 可用 here ,它也应该做得很好。

关于c - 已知值的完美散列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8132431/

10-11 18:37