C 我不知道';我不理解这个哈希函数代码

C 我不知道';我不理解这个哈希函数代码,c,data-structures,linked-list,hashcode,hash-function,C,Data Structures,Linked List,Hashcode,Hash Function,有人能解释一下这个散列函数是如何工作的吗?我花了很多时间试图弄明白它,但仍然不知道它是如何工作的 完整代码来自 //对单词进行哈希运算(Delipite在reddit上发布的哈希函数) //要散列的单词包含在新节点、箭头、单词中。 //散列将为您提供索引。然后将单词插入到链表中。 int散列索引(char*hash\u this) { 无符号整数散列=0; for(inti=0,n=strlen(散列);i

有人能解释一下这个散列函数是如何工作的吗?我花了很多时间试图弄明白它,但仍然不知道它是如何工作的

完整代码来自

//对单词进行哈希运算(Delipite在reddit上发布的哈希函数)
//要散列的单词包含在新节点、箭头、单词中。
//散列将为您提供索引。然后将单词插入到链表中。
int散列索引(char*hash\u this)
{
无符号整数散列=0;
for(inti=0,n=strlen(散列);ihash=(hash哈希函数ist用于检索给定序列(字节、字符等)的唯一值

因此,您需要序列的长度,这里使用“strlen”


没有位移位运算符(他使用的是
strlen
,因为他迭代字符串并处理每个字符。他还可以测试
hash_这个[i]
不是零:

for ( int i = 0; hash_this[i] != 0; i++ )
  ...
这会做同样的事情

按位运算符阻止哈希函数为相同字母的不同组合计算相同的索引。您希望
哈希索引(“bat”)
返回不同的值,然后
哈希索引(“tab”)


为不同的字符串返回相同的索引被称为冲突,这是您要避免的事情,因此大多数好的哈希函数对每个字符执行某种算术或按位操作以最小化这种可能性。

哈希函数需要什么
h
如果x==y,那么h(x)=h(y)
如果您满足此条件,则有一个有效的哈希函数。理想情况下,您的函数还应该为不同的输入分配不同的哈希值。(将所有值哈希为零是有效的,但会像垃圾一样执行,因为所有值都会发生冲突)…因此,函数以确定性的方式对输入值进行跳转,这显然是有效的,位操作是廉价的,为什么不呢,它是否会产生冲突取决于它得到的输入集。是的,这让它更清楚。现在我感兴趣的是将所有内容散列到零,以测试代码的计时:)谢谢你的解释。这很有帮助。谢谢你,兄弟,两个答案都很好。我非常感谢。
for ( int i = 0; hash_this[i] != 0; i++ )
  ...