如何散列std :: string?

时间:2011-11-06 18:00:52

标签: c++ string hash cryptography std

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

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

4 个答案:

答案 0 :(得分:23)

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

#include <string>
#include <unordered_map>

hash<string> hasher;

string s = "heyho";

size_t hash = hasher(s);

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

答案 1 :(得分:11)

使用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);

查看更多here

答案 2 :(得分:1)

您可以使用STL functor hash。看看你的STL lib是否包含它。

请注意,此广告会返回size_t,因此范围为numeric_limits<size_t>::min() numeric_limits<size_t>::max()。如果这是不可接受的,你将不得不使用SHA。

答案 3 :(得分:0)

首先是一些理论:https://cp-algorithms.com/string/string-hashing.html
对于严重的问题,请使用不同基数的哈希对。
在线性时间内,可以构建散列器来回答 N(1) 中给定字符串的任何子串的散列查询
来自我的 github 的简单工作示例: https://github.com/vSzemkel/CppStuff/blob/master/classic/polynomial_hasher.cpp