8

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

即便如此,我想检测是否在运行中使用了相同的参数。对于不同的编译版本和不同的机器,相同的输入是否std::hash给出相同的结果?

例如

std::hash<string>{}("TestcaseParamVal0.7Param0.4");

这将永远是一个唯一的数字吗?

4

1 回答 1

12

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

一些实现不遗余力地在执行之间更改哈希结果,因为它减轻了由于哈希表在存在许多具有相同哈希的键时性能不佳而导致的拒绝服务风险。这是标准明确允许的,它只保证结果在程序期间是一致的。

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

于 2018-07-03T01:15:20.853 回答