首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用c++将字符串散列为整型?

如何使用c++将字符串散列为整型?
EN

Stack Overflow用户
提问于 2010-03-29 09:04:50
回答 10查看 43K关注 0票数 17

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

EN

回答 10

Stack Overflow用户

回答已采纳

发布于 2010-03-29 09:12:12

你是第一个问题,当然,例如,就像这样:

代码语言:javascript
运行
复制
int hash = 0;
int offset = 'a' - 1;
for(string::const_iterator it=s.begin(); it!=s.end(); ++it) {
  hash = hash << 1 | (*it - offset);
}

关于第二种方法,有很多更好的方法来散列字符串。例如,参见here中的几个C示例(很容易按照上面代码片段的行将其翻译成C++ )。

票数 7
EN

Stack Overflow用户

发布于 2012-11-21 13:52:29

根据我的个人经验,我知道这是可行的,并产生了很好的发行版。(抄袭自http://www.cse.yorku.ca/~oz/hash.html):

djb2

该算法(k=33)由dan bernstein于多年前在comp.lang.c上首次报道。该算法的另一个版本(现在得到bernstein的青睐)使用xor: hash(i) = hash(i - 1) * 33 ^ stri;数字33的魔力(为什么它比许多其他常量更好,不管是不是素数)从未得到充分解释。

代码语言:javascript
运行
复制
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;
}
票数 9
EN

Stack Overflow用户

发布于 2010-03-29 09:09:14

您可以使用[]操作符检查std::string中的每个字符。但是,您可以查看Boost::Functional/Hash以获得更好的散列方案的指导。在c中的here中也有一个散列函数列表。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2535284

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档