【问题标题】:Can someone explain to me how this HASH FUNCTION works (also if they have another better option)?有人可以向我解释这个 HASH FUNCTION 是如何工作的(如果他们有另一个更好的选择)?
【发布时间】:2020-10-17 15:39:39
【问题描述】:

我正在研究 CS50 的 pset 5,拼写器。我需要一个散列表的散列函数,它可以有效地存储字典中的所有单词(~140,000)。我在网上找到了这个,但我不明白它是如何工作的。我不知道<<^ 是什么意思。这是哈希函数,谢谢! (如果您能帮助我,我将不胜感激:))

int hash_it(char* needs_hashing)
{
    unsigned int hash = 0;
    for (int i=0, n=strlen(needs_hashing); i<n; i++)
        hash = (hash << 2) ^ needs_hashing[i];
    return hash % HASHTABLE_SIZE;
}

【问题讨论】:

  • &lt;&lt;^ 是基本的 C 运算符,将在任何 C 书籍或教程中介绍。如果您查阅这些资源以了解此类语言基础知识或使用您最喜欢的搜索引擎进行一些基础研究,那将是最好的..
  • 这不是一个好的散列函数。对于这个应用程序,我建议使用 CityHash 或 SipHash。

标签: c operators hashtable cs50 hash-function


【解决方案1】:

这两个是按位运算符。这些很容易学习,程序员必须学习。

&lt;&lt; - 是二元左移运算符。

假设变量“hash”二进制是“0011”。

hash &lt;&lt; 2 变为“1100”。

^ 是XOR 运算符。 (如果只在一个操作数中设置......不是在两个)

假设在你的代码中

hash &lt;&lt; 2 给出“1100”

needs_hashing[1] 给出“1111”

然后

(hash &lt;&lt; 2) ^ needs_hashing[i] 给出“0011”

如需快速了解位运算符,请快速浏览此处 https://www.tutorialspoint.com/cprogramming/c_bitwise_operators.htm

【讨论】:

    【解决方案2】:

    在原题目中,演示了非常低效的哈希函数。计算后哈希的两个最低位等于输入行needs_hashing 中最后一个字符的两个最低位。结果,例如,如果所有字符串都包含最后一个字符的偶数 ascii 代码,那么如果 HASHTABLE_SIZE 是偶数(2^n 左右),那么您的所有哈希也将是偶数。

    更高效的哈希,基于循环移位:

    uint32_t hash_it(const char *p) {
      uint32_t h = 0xDeadBeef;
      while(char c = *p++)
        h = ((h << 5) | (h >> (32 - 5))) + c;
      h ^= h >> 16;
      return h % HASHTABLE_SIZE;
    }
    

    【讨论】:

      猜你喜欢
      • 2020-10-11
      • 1970-01-01
      • 1970-01-01
      • 2015-11-25
      • 1970-01-01
      • 2023-01-18
      • 2011-09-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多