【问题标题】:A perfect hash for known values已知值的完美哈希
【发布时间】:2016-06-21 19:17:02
【问题描述】:

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

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

等等……

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

【问题讨论】:

  • 你在用这个哈希表做什么?由于您可以枚举您将使用的所有键,因此您可能希望使用不同的数据结构,例如预先计算的 trie。

标签: c hash


【解决方案1】:

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

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

Murmur3 和 crapwow 是值得关注的(不过,我会谨慎使用 crapwow),Google's CityHashxxHash 也值得一看。 Bob Jenkins 也有一个很好的基于最小完美哈希的映射 here,应该也可以。

【讨论】:

  • +1,我还建议您查看CMPH,它允许您在运行时构建(可选最小)完美的哈希表。
  • 指向 team5150.com 的链接已失效,并重定向到恶意网站。
【解决方案2】:

维基百科给出this page。但是你确定你想要一个完美的哈希函数吗?也许一个又好又快的哈希函数就足够了?

【讨论】:

    猜你喜欢
    • 2014-09-02
    • 2023-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-26
    • 2011-11-11
    • 2015-02-25
    • 1970-01-01
    相关资源
    最近更新 更多