c - 已知值的完美哈希

标签 c hash

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

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

等...

但这些值(0x78409、0x89934、0x89834)仅在运行时已知,因此不能使用switch/case。然而,它们在执行开始时就已知了,所以也许我们可以创建一个哈希函数,它可以 self 调整以制作一个完美的哈希表。所以我的问题是,我们能否为这种情况创建一个完美的哈希函数。

最佳答案

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

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

Murmur3 和 crapwow 是需要注意的(尽管我对 crapwow 持谨慎态度),Google's CityHash , 和 xxHash也值得一看。 Bob Jenkins 也有一个很好的基于最小完美散列的 map 可用 here ,这也应该做得很好。

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

相关文章:

javascript - v8 如何对哈希表中的键进行哈希处理

algorithm - 将长整数 ID 散列为较小的字符串

c - 如何在 C 中可移植地打印 int64_t 类型

c++ - PeekMessage问题

c - 此变量声明会造成内存问题

java - JAVA中使用MD5比较文件内容

c - ld : can't open output file for writing: bin/s, errno=2 架构 x86_64

c - 警告/错误 "function declaration isn' t 原型(prototype)”

bcrypt 的.Net 实现,它实现了HashAlgorithm?

Java 位掩码编码多个大小不同的整数