C的最小哈希函数?

时间:2009-04-13 13:54:19

标签: c hash hashtable

我不能使用boost:hash因为我必须坚持使用C而不能使用C ++。

但是,我需要散列大量(10K到100k)的令牌字符串(长度为5到40个字节),以便在这些字符串中搜索最快。

MD5,SHA1或任何长哈希函数对于一个简单的任务来说似乎太重了,我没有做加密。此外还有存储和计算成本。

因此我的问题是:

  1. 在大多数实际案例中,最简单的哈希算法可以确保防止碰撞。

  2. 哈希值使用多少位?我正在为32位系统开发。 Perl / Python中的哈希算法是否也使用32位哈希?或者我必须跳到64?

  3. 关于常见脚本语言中哈希表的实现:实现是否检查冲突,还是可以完全避免该部分?

6 个答案:

答案 0 :(得分:23)

您可以在 http://www.azillionmonkeys.com/qed/hash.html

找到一个好的(快速的)哈希函数和一个有趣的读物

唯一一次你不应该检查碰撞,就是你使用了一个完美的哈希 - 一个很好的老式查找表,比如gperf

答案 1 :(得分:11)

  1. Here是对最着名的哈希函数的一个很好的概述。

  2. 32位应该可以正常工作。

  3. 你总是需要检查碰撞,除非你想写一个有趣的哈希表:)

答案 2 :(得分:8)

hash table lookup的常规哈希函数。它指定不要用于加密目的,但由于您指定了您没有意图,那么您应该没问题。

  

包含哈希函数调查以试用

答案 3 :(得分:5)

如果你使用类似posix的系统并且坚持使用普通的C,我只会使用系统已经提供的功能。 man 3 hcreate为您提供所有详细信息,或者您可以在http://linux.die.net/man/3/hcreate

找到在线版本

答案 4 :(得分:2)

尝试Adler32获取长字符串 或Murmur2表示短字符串。

答案 5 :(得分:1)

xxhash是一个非常快速和简单的选择。一个简单的代码将使用XXH32函数:

unsigned int XXH32 (const void* input, int len, unsigned int seed);

它是32位哈希。由于lenint,因此对于大于2^31-1字节的较大数据,请使用以下数据:

void*         XXH32_init   (unsigned int seed);
XXH_errorcode XXH32_update (void* state, const void* input, int len);
unsigned int  XXH32_digest (void* state);