C最小的散列函数?
我不能使用boost:hash,因为我必须坚持使用C,不能使用C ++。
但是,我需要散列大量(10K到100K)的令牌string(长度为5到40个字节),以便在其中search最快。
MD5,SHA1或任何长的散列函数似乎太重了一个简单的任务,我没有做密码学。 另外还有存储和计算成本。
所以我的问题是:
-
在大多数实际情况下,最简单的散列algorithm可以确保防冲突。
-
多less位用于散列值? 我正在开发32位系统。 Perl / Python中的哈希algorithm是否也使用32位哈希? 还是我必须跳到64?
-
关于通用脚本语言中散列表的实现:实现是否检查冲突,还是我可以完全避免该部分?
你可以在http://www.azillionmonkeys.com/qed/hash.htmlfind一个好的(快速的)散列函数和一个有趣的阅读。;
唯一一次你不应该检查碰撞,是如果你使用一个完美的散列 – 一个好老式的查找表,如gperf 。
-
下面是最值得注意的已知哈希函数的一个很好的概述。
-
32位应该工作得很好。
-
你总是需要检查碰撞,除非你想写一个有趣的哈希表:)
散列表查找的一般散列函数。 它指定不要用于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位散列。 由于len
是int
,所以对于大于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);