C 好的散列函数
我一直未能理解散列函数的设计。我正在看一个例子。正如您在函数注释中所看到的,为什么要选择31作为要乘以的数字。你怎么决定?这是随机的还是有意义的C 好的散列函数,c,hashcode,hash-function,C,Hashcode,Hash Function,我一直未能理解散列函数的设计。我正在看一个例子。正如您在函数注释中所看到的,为什么要选择31作为要乘以的数字。你怎么决定?这是随机的还是有意义的 unsigned int hash(hash_table_t *hashtable, char *str) { unsigned int hashval; /* we start our hash out at 0 */ hashval = 0; /* for each character, we multiply
unsigned int hash(hash_table_t *hashtable, char *str)
{
unsigned int hashval;
/* we start our hash out at 0 */
hashval = 0;
/* for each character, we multiply the old hash by 31 and add the current
* character. Remember that shifting a number left is equivalent to
* multiplying it by 2 raised to the number of places shifted. So we
* are in effect multiplying hashval by 32 and then subtracting hashval.
* Why do we do this? Because shifting and subtraction are much more
* efficient operations than multiplication.
*/
for(; *str != '\0'; str++) hashval = *str + (hashval << 5) - hashval;
/* we then return the hash value mod the hashtable size so that it will
* fit into the necessary range
*/
return hashval % hashtable->size;
}
下面是一个关于具有65k视图的哈希函数的讲座。在youtube上:
这并不是你想要的,但是你的问题表明你在哈希方面的知识是有限的。最好阅读教程或查看演示文稿 这里有一个关于65k视图的哈希函数的讲座。在youtube上:
这并不是你想要的,但是你的问题表明你在哈希方面的知识是有限的。最好阅读教程或查看演示文稿 所讨论的散列称为Bernstein散列、Torek散列或简单的times 33散列。它非常流行,因为它简单、速度快,并且使用英文字符串数据进行了适当的分发 你的评论指出它实际上是乘以31,这在你看来是任意的,实际上有点任意。报告指出,许多可能的常数工作良好33是最常见的。它们都是奇数,接近2的幂,这意味着它们可以很好地转换为移位和加法或减法 有助于理解哈希的其他一些资源:
所讨论的散列被称为Bernstein散列、Torek散列或简单的times 33散列。它非常流行,因为它简单、速度快,并且使用英文字符串数据进行了适当的分发 你的评论指出它实际上是乘以31,这在你看来是任意的,实际上有点任意。报告指出,许多可能的常数工作良好33是最常见的。它们都是奇数,接近2的幂,这意味着它们可以很好地转换为移位和加法或减法 有助于理解哈希的其他一些资源:
这就是众所周知的伯恩斯坦散列,托瑞克散列,或者简单的泰晤士报33散列。我建议阅读来自的评论。这被称为伯恩斯坦散列,托瑞克散列,或者简单的泰晤士报33散列。我建议阅读来自的评论。我基本上在思考什么是设计哈希函数的好方法。。现在,至少他们中的大多数都是反复试验的事实让我松了一口气。我理解时间33散列。谢谢,我一直在思考什么是设计散列函数的好方法。。现在,至少他们中的大多数都是反复试验的事实让我松了一口气。我理解时间33散列。非常感谢。