我正在为C ++寻找md5,我意识到md5没有内置(即使有很多非常好的库来支持md5功能)。然后,我意识到我实际上并不需要md5,任何散列方法都可以。因此,我想知道C ++是否具有这样的功能?我的意思是,内置散列函数?
在我研究C ++的过程中,我看到Java,PHP和其他一些编程语言都支持md5。例如,在PHP中,您只需要调用:md5("your string");
。
一个简单的哈希函数就可以了。 (如果可能,请提供一些关于如何使用它的简单代码。)
答案 0 :(得分:11)
这很简单。使用C ++ 11,你得到了一个
hash<string>
functor 你可以这样使用(未经测试,但给你的想法):
hash<string> h;
const size_t value = h("mystring");
如果您没有C ++ 11,请查看boost,也许boost::tr1::hash_map
。它们也可能提供字符串散列函数。
对于非常简单的情况,你可以从这些方面开始:
size_t h = 0
for(int i=0; i<s.size(); ++i)
h = h*31 + s[i];
return h;
接受以下评论。要防止短字符串聚集,您可能需要以不同方式初始化h
。也许你可以使用它的长度(但这只是我的第一个想法,未经证实):
size_t h = numeric_limits::max<size_t>() / (s.length()+1); // +1: no div-by-0
...
这不应该比以前更糟糕,但仍然远非完美。
答案 1 :(得分:8)
这取决于你拥有哪个版本的C ++ ......以及你正在寻找什么样的散列函数。
C ++ 03没有任何散列容器,因此不需要散列。虽然许多编译器一直在提出自定义标题。否则Boost.Functional.Hash可能有帮助。
C ++ 0x具有unordered_
系列容器,因此是一个std::hash
谓词,它已经适用于C ++标准类型(内置类型和std::string
,至少)
但是,这是一个简单的哈希,足以用于哈希映射,不是为了安全。
如果您正在寻找加密哈希,那么问题就完全不同了(并且md5很松散),并且您需要一个库(例如)SHA-2哈希。
如果您正在寻找速度,请查看CityHash和MurmurHash。两者都有限制,但它们都经过了大量优化。
答案 2 :(得分:4)
如何使用boost,Boost.Functional/Hash