Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何散列std::string?_C++_String_Hash_Cryptography_Std - Fatal编程技术网

C++ 如何散列std::string?

C++ 如何散列std::string?,c++,string,hash,cryptography,std,C++,String,Hash,Cryptography,Std,我正在做一个小实用程序,通过重复来帮助我记住密码。我想输入每天只记住一次的密码,而不是在每次会话之前。当然,我不会存储密码本身,但很乐意存储它的散列 p> >从 STD::String 使用C++标准库获得什么散列的最简单方法?< /P> < P>对于不涉及外部库的快速解决方案,可以使用哈希< /C> >散列字符串< /代码> s。它的定义是包含头文件hash\u map或unordered\u map(或其他一些文件) #包括 #包括 散列哈希器; 字符串s=“heyho”; 大小\u t散

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


<> p> >从<代码> STD::String 使用C++标准库获得什么散列的最简单方法?< /P> < P>对于不涉及外部库的快速解决方案,可以使用<代码>哈希< /C> >散列<代码>字符串< /代码> s。它的定义是包含头文件
hash\u map
unordered\u map
(或其他一些文件)

#包括
#包括
散列哈希器;
字符串s=“heyho”;
大小\u t散列=散列器;
如果你决定要增加SHA的安全性,如果你不需要它的所有其他功能,你不需要下载大型Crypto++库;internet上有很多独立的实现,只需搜索“sha实现c++”。

您可以使用。看看你的STL库有没有

请注意,这个函数返回一个
size\u t
,因此范围是
numeric\u limits::min()
numeric\u limits::max()
。如果不能接受,您必须使用SHA或其他工具。

使用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);
#包括
#包括
std::size_t h1=std::hash{}(“MyString”);
std::size_t h2=std::hash{}(3.14159);
请参阅更多。

首先了解一些理论:
对于严重的问题,使用具有不同基数的哈希对。
在线性时间内,可以构建哈希器来回答N(1)中给定字符串的任何子字符串的哈希查询
my github中的简单工作示例:

这不是一个加密安全的散列。@KonradRudolph,但他确实说了“最简单的方法”和“使用[C++标准库]”,所以我想我应该让他知道这一点,因为它符合这两个标准。只要不恢复原始密码,是否有人可以破坏此程序的散列并不重要。它将是高熵的,因此需要一个程序来记住它:)如果可以恢复原始密码,请告诉我,因为我不太擅长密码学。@septgram我认为没有一个标准的
哈希实现。因此,使用它得到的结果会因编译器而异。这只是意味着我不知道它是否是可逆的,因为编写实现的人可能不会非常小心地看到它是不可逆的,因为他们没有预料到会有人使用它来散列密码(可能)。因为人们仍然在寻找这个答案,我想补充一点,由于c++14,在程序的多次执行中,生成的哈希不能保证相同。请参阅n4659草稿中的注释或第20.5.3.4.1.3节。我还没有达到您的目标:“通过重复帮助我记住密码”-您想要一个工具,可以让您经常重复密码,以便更轻松地记住它?不过,这不符合问题的其余部分。@PaŭloEbermann,这只是为了上下文。是的,这是一个在我将强密码应用到任何东西之前几天练习输入强密码的工具,所以我不会突然忘记它。第一个是散列映射中的散列:它必须具有良好的分布并能够快速计算(典型:Murruil3,CityHash),如果冲突很少就更好了,但可能没那么重要。第二种是加密安全的散列,即使这样也有各种用法(签名与密码存储)。对于密码存储的情况,您需要一些计算成本很高的东西,例如河豚,您需要在对密码进行散列之前对密码进行盐分(随机决定盐分,沿散列存储)。@septgram读取除了大小问题之外,它也可能不是加密安全的散列,也就是说,知道实现和散列,很容易找到包含此散列的字符串。“你不希望这个用于密码散列。”帕洛伯曼同意。问题的标题可能会产生误导。:)这行代码的意思是什么std::hash{}@Kapil调用
std::hash
type的构造函数,该构造函数分配一个未命名的实例。然后它调用它的
()
操作符。
#include <string>
#include <unordered_map>

std::size_t h1 = std::hash<std::string>{}("MyString");
std::size_t h2 = std::hash<double>{}(3.14159);