对于不同的编译版本和不同的机器,std :: hash是否为相同的输入提供相同的结果?

Nel*_*nto 7 c++ portability hashtable distributed-computing stdhash

我有一些随机测试参数,我需要计算一个哈希来检测我是否运行相同的参数.我可以使用在不同时间重新编译的相同源来运行测试,或者在不同的机器上运行.

即便如此,我想检测相同的参数是否用于运行.std::hash对于不同的编译版本和不同的机器,是否为相同的输入提供相同的结果?

例如

std::hash<string>{}("TestcaseParamVal0.7Param0.4");
Run Code Online (Sandbox Code Playgroud)

这总是一个独特的数字吗?

zne*_*eak 9

不,std::hash不保证计算机,构建甚至在同一台计算机上执行相同构建的结果都是相同的.您唯一的保证是在一次执行期间,相同的对象具有相同的哈希值.(当然,不能保证不相等的物体具有不同的哈希值.)

一些实现在他们的方式之间改变了执行之间的哈希结果,因为它减少了由于在具有相同哈希的许多密钥存在的情况下哈希表的性能差而导致的拒绝服务风险.标准明确允许这一点,该标准仅保证结果在程序持续时间内保持一致.

如果您需要执行和机器之间的可重复性,您不能使用std::hash并且必须推出自己的等效物.