c++ - 如何使用 c++ 将字符串散列为 int?

标签 c++ hash string cstring

我必须编写自己的哈希函数。如果我只想制作一个简单的哈希函数,将字符串中的每个字母映射到一个数值(即 a=1,b=2,c=3,...),有没有办法可以在一个字符串,而不必先将其转换为 c 字符串来查看每个单独的字符?有没有更有效的哈希字符串方法?

最佳答案

根据个人经验,我知道这很有效并且产生了良好的分布。 (抄袭自http://www.cse.yorku.ca/~oz/hash.html):

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;
}

关于c++ - 如何使用 c++ 将字符串散列为 int?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2535284/

相关文章:

ruby - 将包含键迭代的数组应用于哈希

Java 字符串方法

C++ - 对于指向对象的指针 vector ,重新分配是否会导致删除和复制对象?

javascript - 在 JavaScript 中将用户输入编码为 URL GET 参数

python - 使用重载方法进行散列

python-3.x - 我必须编写一个代码,获取一个名字并将其转换为姓氏、第一个首字母和中间首字母格式

Android:从视频 URI 创建视频缩略图

C++ 指针与数组表示法

c++ - 我怎么能说 visual studio 将库与我的项目链接起来?

c++ - 在cout中禁用逗号?