【问题标题】:How do you hash a string? I need random strings somehow turned into integers to put them in my hash table你如何散列一个字符串?我需要以某种方式将随机字符串转换为整数以将它们放入我的哈希表中
【发布时间】:2011-11-12 19:48:15
【问题描述】:

例如,“foobar”应该散列到类似 3456 的值。我的散列表数组的大小为 811,所以我的散列函数将执行 3456 % 811 来查找散列表中放置“foobar”的位置。

有什么建议吗?

【问题讨论】:

标签: c++ hashtable type-conversion hash


【解决方案1】:

我建议来自Hash Functionsdjb2

djb2

这个算法 (k=33) 是 dan bernstein 多年前在 comp.lang.c 中首次报道的。该算法的另一个版本(现在被 bernstein 青睐)使用 xor:hash(i) = hash(i - 1) * 33 ^ str[i];数字 33 的魔力(为什么它比许多其他常数工作得更好,无论是否素数)从未得到充分解释。

unsigned long hash(unsigned char *str)
{
    unsigned long hash = 5381;
    int c;

    while (c = *str++)
        hash = ((hash << 5) + hash) + c; /* hash * 33 + c */

    return hash;
}

也很感兴趣

是引用的原始 K&R 书中的 lose lose 实现。 如何散列你的字符串的一个很好的例子。

【讨论】:

    【解决方案2】:

    提升函数/哈希

    http://www.boost.org/doc/libs/1_47_0/doc/html/hash/tutorial.html

    #include <boost/functional/hash.hpp>
    
    int main()
    {
        boost::hash<std::string> string_hash;
    
        std::size_t h = string_hash("Hash me");
    
        size_t table_index = h % 811;
    }
    

    【讨论】:

    • 这很有趣。不过,我想自己制作一个实际的(简单的)散列函数。实际上我可能会这样做,但这只是一个练习。
    【解决方案3】:

    您可以使用构建它的 stdlib 函数:

    #include <stdlib.h>
    i = atoi(char *);
    

    它返回那个字符串的整数值。

    【讨论】:

    • @delnan:但它是一种可能的哈希方法...一种可能但非常糟糕的方法 :-)
    • 我必须尝试一下...我想要简单,无论效率如何。它只用于锻炼。
    • 谁反对这个答案:为什么?不管它有多“糟糕”,这似乎都是一个有效的答案。
    猜你喜欢
    • 1970-01-01
    • 2012-03-10
    • 1970-01-01
    • 2018-04-25
    • 2020-07-06
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    • 2018-05-22
    相关资源
    最近更新 更多