我有一些随机测试参数,需要为它们计算一个散列以检测是否以相同的参数运行。我可能会使用在不同时间重新编译的相同源代码或在不同计算机上运行该测试。
即使如此,我也想检测是否对运行使用了相同的参数。
对于不同的编译版本和不同的机器,std::hash
对于相同的输入是否给出相同的结果?
例如
std::hash<string>{}("TestcaseParamVal0.7Param0.4");
这总是一个唯一的数字吗?
答案 0 :(得分:8)
否,std::hash
不保证结果在不同计算机,内部版本甚至同一计算机上同一内部版本的执行结果相同。您唯一的保证是在一次执行期间,相等的对象具有相同的哈希值。 (当然,不能保证不相等的对象具有不同的哈希值。)
一些实现方式在执行之间更改哈希结果时会竭尽所能,因为它可以减轻由于存在许多具有相同哈希值的键而导致哈希表性能不佳而导致的拒绝服务风险。该标准明确允许这样做,它仅保证结果在程序运行期间是一致的。
如果需要执行与机器之间的可重复性,则不能使用std::hash
,而必须推出自己的等效项。