我正在尝试创建一个结构
struct Obj {
id: i32,
value: i64,
}
Run Code Online (Sandbox Code Playgroud)
可以用在 aBinaryHeap和 a 中HashSet。
当与 一起使用时BinaryHeap,我希望它基于 进行排序value。当与 一起使用时HashSet,我希望它与 一起进行哈希处理id。
这两个都需要该特征的实现Eq,但我找不到一种方法来拥有两种不同的Eq.
我发现的最接近的是Rust 中同一类型的相同特征的多个实现,但这似乎只有在该特征接受通用参数时才有效,但事实并非如此Eq
不要这样做。在 Rust 中Hash,Eq实现必须相互一致。Hash特征的文档特别指出:
\n\n在实现 Hash 和 Eq 时,保持以下属性非常重要:
\nRun Code Online (Sandbox Code Playgroud)\nk1 == k2 -> hash(k1) == hash(k2)\n换句话说,如果两个键相等,那么它们的哈希值也必须相等。HashMap 和 HashSet 都依赖于这种行为。
\n值得庆幸的是,当使用 #[derive(PartialEq, Eq, Hash)] 派生 Eq 和 Hash 时,\xe2\x80\x99 不需要担心维护此属性。
\n违反此属性是一个逻辑错误。逻辑错误导致的行为未指定,但特征的用户必须确保此类逻辑错误不会导致未定义的行为。这意味着不安全的代码不能依赖于这些方法的正确性。
\n
使用newtype模式创建两种以不同方式实现Hashand 的类型Eq,并将它们用作HashMapand的元素BinaryHeap元素。
k1 == k2 -> hash(k1) == hash(k2)\nRun Code Online (Sandbox Code Playgroud)\n