我正在使用C语言实现哈希表,并测试字符串的哈希函数。
首先,我尝试了将ASCII码相加并使用模运算(% 100
),但是在第一组包含130个单词的数据测试中,结果很差:40个冲突。
最终输入的数据将包含8000个单词(这是一个存储在文件中的字典)。哈希表声明为int table[10000]
,其中包含单词在.txt文件中的位置。
- 什么是最适合哈希字符串的算法?
- 如何确定哈希表的大小?
我正在使用C语言实现哈希表,并测试字符串的哈希函数。
首先,我尝试了将ASCII码相加并使用模运算(% 100
),但是在第一组包含130个单词的数据测试中,结果很差:40个冲突。
最终输入的数据将包含8000个单词(这是一个存储在文件中的字典)。哈希表声明为int table[10000]
,其中包含单词在.txt文件中的位置。
我想为像我一样的C语言新手总结一下。根据Andriy Makukha的精确努力,MurmurHash3
是最好的选择:
unsigned long hash(const char* str){
unsigned int h = 0x12345678;
for (; *str; ++str) {
h ^= *str;
h *= 0x5bd1e995;
h ^= h >> 15;
}
return h;
}
stdint.h
中的类型来指定算法所需的确切整数宽度,这里显然是32位。我记得,long类型可能超过32位,例如64位是允许的,这种情况下,该算法可能不是最优的。 - undefined