C ++ std :: hash实现是否总是确定性的?

时间:2018-07-26 17:11:58

标签: c++ hash std

我知道std::hash<T>是依赖于实现的,但是它们应该是确定性的吗?

我知道,如果我在同一进程中对某个值多次运行std::hash<T>函数,我将获得相同的输出。但是,如果重新启动该过程,我会得到相同的值吗?是否有用于std :: hash的种子?它取决于编译器版本还是其他因素?

是否有保证,无论何时启动运行的进程,计算机或编译器版本,输入X总是可以得到输出Y

3 个答案:

答案 0 :(得分:7)

否,documentation明确指出:

  

仅要求散列函数在程序的单次执行中为相同的输入产生相同的结果;这样可以使用盐腌的哈希来防止冲突DoS攻击。

重点是我的。这是因为C ++ 14,但是我们不能假定它会在C ++ 11中工作,因为没有明确提供这种保证。

答案 1 :(得分:3)

已启用的std::hash专业化满足Hash的要求([hash.requirements]),具体根据哪个

  

在程序运行期间,返回的值仅取决于参数...。

即使哈希调用在同一台计算机上具有相同的二进制映像,也不能保证哈希值在调用之间是稳定的。

答案 2 :(得分:2)

根据c++ standard

  

仅需要哈希函数才能产生相同的结果   在程序的一次执行中的相同输入;这可以加盐   防止冲突DoS攻击的哈希值。