对于不同的编译版本和不同的机器,std::hash 是否会为相同的输入给出相同的结果?
Does std::hash give same result for same input for different compiled builds and different machines?
我有一些 运行dom 测试参数,我需要为其计算哈希值以检测我是否 运行 具有相同的参数。我可能 运行 使用相同源代码在不同时间重新编译的测试,或者 运行 在不同机器上的测试。
即便如此,我还是想检测一下 运行 是否使用了相同的参数。
std::hash
对于不同编译版本和不同机器的相同输入给出相同的结果吗?
例如
std::hash<string>{}("TestcaseParamVal0.7Param0.4");
这将永远是一个唯一的号码吗?
不,std::hash
不保证结果在不同的计算机、构建甚至同一计算机上执行相同的构建时都是相同的。您唯一的保证是在一次执行期间,相等的对象具有相同的哈希值。 (当然,不能保证不相等的对象具有不同的哈希值。)
一些实现不遗余力地在执行之间更改散列结果,因为它减轻了在存在许多具有相同散列的键的情况下由于散列表性能不佳而导致的拒绝服务风险。这是标准明确允许的,它只保证结果在程序运行期间是一致的。
如果您需要执行和机器之间的可重复性,则不能使用 std::hash
并且必须推出您自己的等效项。
我有一些 运行dom 测试参数,我需要为其计算哈希值以检测我是否 运行 具有相同的参数。我可能 运行 使用相同源代码在不同时间重新编译的测试,或者 运行 在不同机器上的测试。
即便如此,我还是想检测一下 运行 是否使用了相同的参数。
std::hash
对于不同编译版本和不同机器的相同输入给出相同的结果吗?
例如
std::hash<string>{}("TestcaseParamVal0.7Param0.4");
这将永远是一个唯一的号码吗?
不,std::hash
不保证结果在不同的计算机、构建甚至同一计算机上执行相同的构建时都是相同的。您唯一的保证是在一次执行期间,相等的对象具有相同的哈希值。 (当然,不能保证不相等的对象具有不同的哈希值。)
一些实现不遗余力地在执行之间更改散列结果,因为它减轻了在存在许多具有相同散列的键的情况下由于散列表性能不佳而导致的拒绝服务风险。这是标准明确允许的,它只保证结果在程序运行期间是一致的。
如果您需要执行和机器之间的可重复性,则不能使用 std::hash
并且必须推出您自己的等效项。