c++ - std::hash 对于不同编译版本和不同机器的相同输入是否给出相同的结果?

标签 c++ hashtable distributed-computing portability stdhash

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

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

例如

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

这将始终是一个唯一的数字吗?

最佳答案

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

一些实现特意在执行之间更改散列结果,因为它减轻了在存在许多具有相同散列的键的情况下由于散列表性能不佳而导致的拒绝服务风险。这是标准明确允许的,它只保证结果在程序运行期间是一致的。

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

关于c++ - std::hash 对于不同编译版本和不同机器的相同输入是否给出相同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51145320/

相关文章:

c++ - constexpr 数组作为模板非类型参数的 MSVC 错误

c++ - 试图将字符串添加到 vector

c# - 如何使用 C#.NET HashTable 实现所需的 JSON 格式

java - <String,String> 类型的哈希表正在存储 <String, Integer> 类型的值,正如我在日志猫和调试器中看到的那样。是否可以?

parallel-processing - go是使用共享内存还是分布式计算

xml - 在配置 hadoop 时启动 yarn 服务时出现错误

c++ - C/C++中随机数生成器的实现

c++ - 两个序列与 STL 的匹配数

Java 集合排序加上手动排序

java - Hazelcast - 客户端模式 - 集群故障后如何恢复?