我有一长串英语单词,我想对它们进行哈希处理。什么是好的哈希函数?到目前为止,我的散列函数对字母的 ASCII 值求和,然后对表大小取模。我正在寻找有效且简单的东西。
简单地对字母求和并不是一个好的策略,因为排列会给出相同的结果。
这个 (djb2 http://www.cse.yorku.ca/%7Eoz/hash.html) 非常流行并且可以很好地处理 ASCII 字符串。
unsigned long hashstring(unsigned char *str)
{
unsigned long hash = 5381;
int c;
while (c = *str++)
hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
return hash;
}
更多信息here https://stackoverflow.com/questions/1579721/why-are-5381-and-33-so-important-in-the-djb2-algorithm.
如果您需要更多替代方案和一些绩效衡量标准,请阅读here http://www.strchr.com/hash_functions.
Added:这些都是general散列函数,其中输入域事先未知(也许除了一些非常一般的假设:例如,上面的方法对于 ascii 输入稍好一些),这是最常见的情况。如果您有一个已知的受限域(固定的输入集),您可以做得更好,请参阅 Fionn 的答案。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)