【问题标题】:How does this Hashing function from CryEngine work?CryEngine 的这个散列函数是如何工作的?
【发布时间】:2013-05-18 02:24:28
【问题描述】:
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;
}

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

对于按位运算,我不是太老练,我知道位移和掩码的工作原理,但仅限于基本场景,例如检查位是否已设置。

这究竟是做什么的?

【问题讨论】:

  • 它按照它所说的去做。问题到底是什么?任何关于 C 或 C++ 的基本教科书都会解释语言中的运算符是什么。
  • 谷歌“线性反馈移位寄存器”。
  • @Kerrek 我想我的问题是它的哈希值究竟如何?我知道散列函数的目标是什么,但这究竟是一个好的散列?

标签: c++ c hash cryengine


【解决方案1】:

阅读here 了解一般概述,然后阅读“一次一次哈希”(Jenkins 撰写),这与这篇文章相吻合。

另见Wikipedia entrythis answer 中提到。

“这到底是个怎样的好哈希?”不完全是。这些转变有点武断,主要来自一些启发式和经验测试。

【讨论】:

  • 万岁!我希望有人能找到关于该理论的良好在线资源。
【解决方案2】:

当您对二进制算术有更广泛的了解时,这类事情会更容易理解。从数学到代码比反过来更容易。

我没有多少运气能找到好的在线资源,但我在学校时对this textbook 的早期版本感到非常满意。你也可以从一个很好的 CS 课程中找到一些关于二进制算术的在线讲义。

This site 总体上可以引导您了解散列理论。我希望我可以在那里推荐一本教科书,但我还没有遇到一本真正清晰的数论教科书。

【讨论】:

    【解决方案3】:

    谁说它的哈希值很好?

    哈希函数将输入(在本例中为字符串)映射到输出(在本例中为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 或任何其他数据结构中使用哈希函数,请确保它已针对您的特定输入进行了调整。不要去拿起你在互联网上找到的第一个。一个好的哈希函数可以为您的特定输入提供尽可能少的冲突。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-07-17
      • 2016-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多