这个哈希函数如何从CryEngine工作

How does this Hashing function from CryEngine work?

本文关键字:CryEngine 工作 哈希 函数      更新时间:2023-10-16
unsigned int HashString( const char *string ) {
    const char* p;
    unsigned hash = 40503;
    for ( p = string; *p != ''; ++p ) {
        hash += *p;
        hash += ( hash << 10 );
        hash ^= ( hash >> 6 );
    }
    hash += ( hash << 3 );
    hash ^= ( hash >> 11 );
    hash += ( hash << 15 );
    return hash;
}

只是在浏览他们的代码。我从来没有见过这样的哈希函数。

当涉及到位操作时,我不是太经验丰富,我知道位移位和掩码是如何工作的,但只在基本的场景中,比如检查位是否设置。

这到底是做什么的?

请阅读此处以获得总体概述,并向下查看"one -at-a- time hash"(由Jenkins编写),与此相同。

也可以参考这个维基百科条目,在这个回答中提到。

"这是一个好的散列吗?"不完全是。这些变化有点武断,主要来自一些启发式和实证测试。

当你对二进制算术有了更广泛的了解后,这类事情就容易理解了。从数学到代码要比从数学到代码容易得多。

我没有多少运气找到一个好的在线资源,但我很高兴在我上学的时候,这本教科书的早期版本。你也可以在网上找到一些关于二进制算术的很好的CS课程的讲义。

这个站点可能会让你大致了解哈希理论。我希望我可以推荐一本教科书,但是我还没有遇到一本真正清晰的数论教科书。

谁说哈希效果好?

哈希函数将输入(本例中为字符串)映射到输出(本例中为unsigned int)。输入的大小为(number of usable characters) ^ number of characters in the string,其中^的"幂次"。

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

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

这意味着有一个"字符串中的字符数",其中输入的大小将大于输出的大小。根据鸽子洞原理,肯定会发生碰撞。实际上,在达到这个阈值之前,可能会发生碰撞。

如果您希望在hash_map或任何其他数据结构中使用哈希函数,请确保它已针对您的特定输入进行了调优。不要在网上找到的第一个就去拿。一个好的哈希函数为你的特定输入提供尽可能少的冲突。

在您的特定情况下,通用散列函数可能不是最优的。专门为某些输入设计的哈希函数(这很可能就是这样的函数)在您的输入上可能会表现得很差。