C 好的散列函数

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

我一直未能理解散列函数的设计。我正在看一个例子。正如您在函数注释中所看到的,为什么要选择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 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散列。非常感谢。