我必须编写自己的散列函数。如果我只想做一个简单的散列函数,将字符串中的每个字母映射到一个数值(即a=1,b=2,c=3,...),有没有一种方法可以在字符串上执行这种散列,而不必首先将其转换为c字符串来查看每个字符?有没有一种更有效的散列字符串的方法?
发布于 2010-03-29 09:12:12
你是第一个问题,当然,例如,就像这样:
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++ )。
发布于 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的魔力(为什么它比许多其他常量更好,不管是不是素数)从未得到充分解释。
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;
}发布于 2010-03-29 09:09:14
您可以使用[]操作符检查std::string中的每个字符。但是,您可以查看Boost::Functional/Hash以获得更好的散列方案的指导。在c中的here中也有一个散列函数列表。
https://stackoverflow.com/questions/2535284
复制相似问题