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

Any built in hash method in C++?

本文关键字:哈希 方法 内置 任何 C++      更新时间:2023-10-16

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

当我研究C++时,我发现Java、PHP和其他一些编程语言支持md5。例如,在PHP中,您只需要调用:md5("your string");

一个简单的散列函数就可以了。(如果可能的话,请包括一些关于如何使用它的简单代码。)

这很简单。使用C++11可以获得

hash<string>

函子,你可以这样使用(未经测试,但给了你想法):

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
...

这应该不会比以前更糟,但还远远不够完美。

这取决于您拥有的C++版本。。。以及你正在寻找什么样的哈希函数。

C++03没有任何散列容器,因此不需要散列。不过,许多编译器已经提出了自定义头。否则,Boost.Functional.Hash可能会有所帮助。

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

然而,这是一个简单的散列,对于散列映射来说足够好,不适合安全

如果你正在寻找加密哈希,那么问题就完全不同了(md5是loosy),你需要一个用于(例如)SHA-2哈希的库。

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

如何使用boost,boost.Functional/Hash