unsigned int HashString( const char *string ) {
const char* p;
unsigned hash = 40503;
for ( p = string; *p != '\0'; ++p ) {
hash += *p;
hash += ( hash << 10 );
hash ^= ( hash >> 6 );
}
hash += ( hash << 3 );
hash ^= ( hash >> 11 );
hash += ( hash << 15 );
return hash;
}
只是徘徊在他们的代码上。我以前从未见过像这样的散列函数。
对于按位运算,我并不太专业,我知道位移和屏蔽是如何工作的,但仅限于检查位是否设置等基本情况。
这到底是做什么的?
答案 0 :(得分:6)
阅读here以获得一般概述,然后选择“一次性哈希”(Jenkins),这与此一致。
另请参阅Wikipedia entry中提到的this answer。
“这究竟是一个好哈希?”不完全是。这些转变有点武断,主要来自一些启发式和实证检验。
答案 1 :(得分:1)
当您对二进制算法有更广泛的理解时,这种事情会更容易理解。从数学到代码比从其他方式开始更容易。
我找到一个好的在线资源并不是很幸运,但是当我在学校时,我对早期版本的this textbook非常满意。您也可以从二进制算术的CS课程中找到一些在线讲义。
This site可能会让你对哈希理论有所了解。我希望我能在那里推荐一本教科书,但我还没有遇到过一本非常清晰的数字理论教科书。
答案 2 :(得分:1)
谁说它哈哈哈哈?
哈希函数将输入(在本例中为字符串)映射到输出,在本例中为unsigned int
。输入的大小为(number of usable characters) ^ number of characters in the string
,其中^
“被提升为”。
如果您的输入字符串只能包含字符 0
和1
,则输入的大小为2^ number of characters in the string
输出的大小是固定的,是unsigned int
中可表示的最大数字。
这意味着字符串中存在“字符数”,其中输入的大小将大于输出的大小。通过pigeon hole principle你肯定会开始发生碰撞。实际上,在达到此阈值之前,您可能发生了碰撞。
如果要在hash_map
或任何其他数据结构中使用哈希函数,请确保将其调整为您的特定输入。不要去找你在互联网上找到的第一个。良好的哈希函数为您的特定输入提供尽可能少的冲突。
在您的特定情况下,通用散列函数可能不是最佳的。专门为某些输入设计的哈希函数(这很可能是这样的函数)可能会在 输入上显着恶化。