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

所有权String与借用str的哈希值是否存在一致性保证?

关于String/str及对应枚举变体的哈希一致性保障

首先可以明确:Rust标准库确实保证了相同字符序列的String和&str会产生相同的哈希值,并且这个保障也会延伸到你例子中的枚举变体上,无论使用哪种符合规范的Hasher实现。

官方依据与设计逻辑

这个一致性并非凭空约定,而是由Rust的核心trait设计和标准库规范所保障的:

  • Borrow trait的强制要求
    String实现了Borrow<str>,而Borrow trait的文档明确规定:如果T: Borrow<U>,那么对于任意Hasher,T和U的哈希值必须相等。这是HashMap::contains_key这类API能正常工作的基础——你可以直接用&str作为参数去查找键类型为String的HashMap,不需要额外转换,哈希一致性是这个功能的前提。

  • 标准库的设计惯例
    对于所有“拥有所有权”和“借用”成对的类型(比如Vec<T>和&[T]、String和&str),标准库的Hash实现都遵循内容相同则哈希相同的原则。这个惯例是为了让API行为符合直觉,避免开发者在使用借用类型查找时遇到意外。

  • 枚举Hash实现的推导逻辑
    你例子中自动推导的枚举Hash实现,会逐个对变体中的成员调用hash方法。因为E1::Second(String)和E2::Second(&str)中的String和&str哈希一致,且其他变体(比如First(i32))的哈希本身就天然一致,所以整个枚举实例的哈希值必然相等。

额外说明

这个一致性保障是跨所有合规Hasher实现的。只要Hasher遵循std::hash::Hasher trait的规范(即相同的输入序列会产生相同的输出),那么相同内容的String和&str(以及对应的枚举变体)的哈希值就会一致。

内容的提问来源于stack exchange,提问作者Bernard

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 16:43:02