CryEngine的Hashing函数如何工作?

时间:2013-05-22 21:26:58

标签: c++ c hash cryengine

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;
}

只是徘徊在他们的代码上。我以前从未见过像这样的散列函数。

对于按位运算,我并不太专业,我知道位移和屏蔽是如何工作的,但仅限于检查位是否设置等基本情况。

这到底是做什么的?

3 个答案:

答案 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,其中^“被提升为”。

如果您的输入字符串只能包含字符 01,则输入的大小为2^ number of characters in the string

输出的大小是固定的,是unsigned int中可表示的最大数字。

这意味着字符串中存在“字符数”,其中输入的大小将大于输出的大小。通过pigeon hole principle你肯定会开始发生碰撞。实际上,在达到此阈值之前,您可能发生了碰撞。

如果要在hash_map或任何其他数据结构中使用哈希函数,请确保将其调整为您的特定输入。不要去找你在互联网上找到的第一个。良好的哈希函数为您的特定输入提供尽可能少的冲突。

在您的特定情况下,通用散列函数可能不是最佳的。专门为某些输入设计的哈希函数(这很可能是这样的函数)可能会在 输入上显着恶化。