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

gen*_*tor 9 c++ hash function

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

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

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

tow*_*owi 11

这很简单.使用C++ 11,你得到一个

hash<string>
Run Code Online (Sandbox Code Playgroud)

你可以像这样使用的仿函数(未经测试,但给你的想法):

hash<string> h;
const size_t value = h("mystring");
Run Code Online (Sandbox Code Playgroud)

如果你没有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;
Run Code Online (Sandbox Code Playgroud)

接下来的评论.要防止短字符串聚集,您可能希望以h不同方式初始化.也许你可以使用它的长度(但这只是我的第一个想法,未经证实):

size_t h = numeric_limits::max<size_t>() / (s.length()+1); // +1: no div-by-0
...
Run Code Online (Sandbox Code Playgroud)

这不应该比以前更糟糕,但仍然远非完美.

  • 请注意,当存在大量非常短的字符串时,此哈希函数趋于聚类.(不经常发生,在大多数情况下它相当不错.) (5认同)

Mat*_* M. 8

这取决于你拥有哪个版本的C++ ...以及你正在寻找什么样的散列函数.

C++ 03没有任何散列容器,因此不需要散列.虽然许多编译器一直在提出自定义标题.否则Boost.Functional.Hash可能会有所帮助.

C++ 0x具有unordered_容器族,因此是一个std::hash谓词,它已经适用于C++标准类型(内置类型std::string,至少).

但是,这是一个简单的哈希,足以用于哈希映射,而不是用于安全性.

如果您正在寻找加密哈希,那么问题就完全不同了(并且md5很松散),并且您需要一个库(例如)SHA-2哈希.

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