C ++中的任何内置哈希方法?

时间:2011-06-01 11:36:46

标签: c++ function hash

我正在为C ++寻找md5,我意识到md5没有内置(即使有很多非常好的库来支持md5功能)。然后,我意识到我实际上并不需要md5,任何散列方法都可以。因此,我想知道C ++是否具有这样的功能?我的意思是,内置散列函数?

在我研究C ++的过程中,我看到Java,PHP和其他一些编程语言都支持md5。例如,在PHP中,您只需要调用:md5("your string");

一个简单的哈希函数就可以了。 (如果可能,请提供一些关于如何使用它的简单代码。)

3 个答案:

答案 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哈希。

如果您正在寻找速度,请查看CityHashMurmurHash。两者都有限制,但它们都经过了大量优化。

答案 2 :(得分:4)

如何使用boost,Boost.Functional/Hash