You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 15:13:13