我知道std::hash<T>
是依赖于实现的,但是它们应该是确定性的吗?
我知道,如果我在同一进程中对某个值多次运行std::hash<T>
函数,我将获得相同的输出。但是,如果重新启动该过程,我会得到相同的值吗?是否有用于std :: hash的种子?它取决于编译器版本还是其他因素?
是否有保证,无论何时启动运行的进程,计算机或编译器版本,输入X
总是可以得到输出Y
?
答案 0 :(得分:7)
否,documentation明确指出:
仅要求散列函数在程序的单次执行中为相同的输入产生相同的结果;这样可以使用盐腌的哈希来防止冲突DoS攻击。
重点是我的。这是因为C ++ 14,但是我们不能假定它会在C ++ 11中工作,因为没有明确提供这种保证。
答案 1 :(得分:3)
已启用的std::hash
专业化满足Hash
的要求([hash.requirements]),具体根据哪个
在程序运行期间,返回的值仅取决于参数...。
即使哈希调用在同一台计算机上具有相同的二进制映像,也不能保证哈希值在调用之间是稳定的。
答案 2 :(得分:2)
仅需要哈希函数才能产生相同的结果 在程序的一次执行中的相同输入;这可以加盐 防止冲突DoS攻击的哈希值。