如何散列std :: string?

Sep*_*ram 17 c++ string hash cryptography std

我正在做一个小工具来帮助我通过重复记住密码.我想输入密码,每天只记住一次,而不是每次会话之前.当然,我本身不会存储密码,但很乐意存储它的哈希值.

那么,std::string使用C++标准库获取哈希的最简单方法是什么?

Set*_*gie 24

对于不涉及外部库的快速解决方案,您可以使用hash<std::string>hash strings.它是通过包含头文件hash_mapunordered_map(或其他一些)来定义的.

#include <string>
#include <unordered_map>

hash<string> hasher;

string s = "heyho";

size_t hash = hasher(s);
Run Code Online (Sandbox Code Playgroud)

如果您决定要增加SHA的安全性,那么如果您不需要所有其他功能,则无需下载大型Crypto ++库; 互联网上有很多独立的实现,只需搜索"sha implementation c ++".

  • @KonradRudolph,但他确实说"最简单的方式"和"使用[C++标准库]",所以我想我会让他知道这一点,因为它符合这两个标准. (14认同)
  • 这不是加密安全散列. (5认同)
  • 由于人们仍在寻找这个答案,我想补充一点,自 c++14 以来,不能保证在程序的多次执行中生成的哈希值是相同的。请参阅 https://en.cppreference.com/w/cpp/utility/hash 中的注释或 n4659 草案的第 20.5.3.4.1.3 节。 (2认同)

小智 14

使用c ++ 11,您可以:

#include <string>
#include <unordered_map>

std::size_t h1 = std::hash<std::string>{}("MyString");
std::size_t h2 = std::hash<double>{}(3.14159);
Run Code Online (Sandbox Code Playgroud)

在这里看到更多.

  • 这行代码是什么意思 std::hash&lt;std::string&gt;{} (3认同)
  • @Kapil调用`std :: hash &lt;std :: string&gt;`类型的构造函数,该类型分配一个未命名的实例。然后调用它的()操作符。 (3认同)