C++标准是否保证std::hash对不同类型等值元素生成相同哈希?
C++标准库
std::hash<>特化的跨类型哈希一致性问题 问题描述
C++标准是否保证标准库的std::hash<>特化,会对比较相等的不同类型值生成相同哈希值?比如下面两行代码是否总能得到相同结果?
std::hash<std::int32_t>{}(1); std::hash<std::int64_t>{}(1);
使用场景
我正在使用支持同构元组类型透明查找的哈希类,例如有这样的std::unordered_map:
std::unordered_map<std::tuple<int, string, double>, string>
目前可以用std::tuple<int, string&, double>对其进行查找,该实现仅对每个元素使用std::hash并组合哈希值。现在想知道:若给定一个std::tuple<int64_t, string, double>,当每个元组元素与原元组对应元素比较相等时,是否能假设两者的哈希输出相同?
回答
- C++标准没有任何保证要求
std::hash<>的不同特化版本,对比较相等的不同类型值生成相同哈希值。 - 以你给出的例子为例,
std::hash<std::int32_t>{}(1)和std::hash<std::int64_t>{}(1)的结果完全可能不同——标准只要求同一类型中相等的值必须生成相同哈希值,不同类型的哈希行为是独立定义的。 - 针对你的元组查找场景:不能假设
std::tuple<int64_t, string, double>和原元组(元素比较相等时)的组合哈希值相同。因为int和int64_t属于不同类型,它们的std::hash特化没有一致性约束,组合后的哈希值自然也无法保证一致。
如果需要实现这种跨类型的哈希一致性,你需要自行定义统一的哈希函数,比如对所有可转换的算术类型,先转换到同一大类型(比如std::int64_t)再计算哈希,或者自定义满足跨类型相等值哈希一致的特化版本。
内容的提问来源于stack exchange,提问作者Curious
相关产品推荐
相关产品推荐

