C最小的散列函数?

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

但是,我需要散列大量(10K到100K)的令牌string(长度为5到40个字节),以便在其中search最快。

MD5,SHA1或任何长的散列函数似乎太重了一个简单的任务,我没有做密码学。 另外还有存储和计算成本。

所以我的问题是:

  1. 在大多数实际情况下,最简单的散列algorithm可以确保防冲突。

  2. 多less位用于散列值? 我正在开发32位系统。 Perl / Python中的哈希algorithm是否也使用32位哈希? 还是我必须跳到64?

  3. 关于通用脚本语言中散列表的实现:实现是否检查冲突,还是我可以完全避免该部分?

你可以在http://www.azillionmonkeys.com/qed/hash.htmlfind一个好的(快速的)散列函数和一个有趣的阅读。;

唯一一次你不应该检查碰撞,是如果你使用一个完美的散列 – 一个好老式的查找表,如gperf 。

  1. 下面是最值得注意的已知哈希函数的一个很好的概述。

  2. 32位应该工作得很好。

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

散列表查找的一般散列函数。 它指定不要用于encryption的目的 ,但既然你指定,你没有意图,那么你应该没问题。

它包括一个哈希函数的调查尝试

如果你使用的是类似posix的系统,并坚持使用普通的C语言,那么我会简单地使用系统已经提供的东西。 男人3 hcreate为您提供所有的细节,或者你可以在这里find一个在线版本http://linux.die.net/man/3/hcreate

尝试Adler32长string或Murmur2短string。

xxhash是相当快速和容易的select。 一个简单的代码将使用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);