【问题标题】:I don't understand this hash-function code我不明白这个哈希函数代码
【发布时间】:2021-03-02 16:08:38
【问题描述】:

谁能解释一下这个哈希函数是如何工作的?我花了很多时间试图弄清楚它,但仍然不知道它是如何工作的。

完整代码来自https://gist.github.com/choaimeloo/ffb96f7e43d67e81f0d44c08837f5944#file-dictionary-c-L30

// Hashes the word (hash function posted on reddit by delipity)
// The word you want to hash is contained within new node, arrow, word.
// Hashing that will give you the index. Then you insert word into linked list.

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

我不明白他为什么使用 (

还有他为什么用strlen(hash_this)?

【问题讨论】:

  • 哈希函数h需要什么? if x == y then h(x) == h(y) 如果你满足这一点,你就有一个有效的散列函数。理想情况下,您的函数还应该为不同的输入分配不同的哈希值。 (将所有内容散列为零是有效的,但会像废话一样执行,因为所有内容都会发生冲突)......所以该函数以确定性的方式对输入值进行攻击,这显然是有效的,位操作很便宜,为什么不呢,它是否会产生冲突取决于它获得的输入集。
  • 是的,这更清楚了。现在我有兴趣将所有内容散列为零以测试该代码的时间:)

标签: c data-structures linked-list hashcode hash-function


【解决方案1】:

散列函数的目的是检索给定序列(字节、字符等)的唯一值。

因此你需要序列的长度,这里用'strlen'。

如果没有位移运算符 (

xor 运算符 (^) 进一步“打乱”/“散列”当前值,因此类似的序列会产生等价的值(想象具有特定模式的序列,例如 'abcabc...' )。

【讨论】:

  • 感谢您的解释。它帮助很大。
【解决方案2】:

他使用strlen,因为他正在遍历字符串并处理每个字符。他还可以测试hash_this[i] 不为零:

for ( int i = 0; hash_this[i] != 0; i++ )
  ...

它会做同样的事情。

位运算符防止哈希函数为相同字母的不同组合计算相同的索引。您希望 hash_index( "bat" ) 返回与 hash_index( "tab" ) 不同的值。

为不同的字符串返回相同的索引被称为冲突,这是你想要避免的事情,所以大多数好的散列函数都会对每个字符进行某种算术或按位运算,以尽量减少这种可能性.

【讨论】:

  • 谢谢兄弟,两个答案都很好。非常感谢。
猜你喜欢
  • 2012-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多