通过不同字段进行哈希和排序的结构(需要不同的 Eq 实现)

Ruf*_*fus 2 rust

我正在尝试创建一个结构

struct Obj {
    id: i32,
    value: i64,
}
Run Code Online (Sandbox Code Playgroud)

可以用在 aBinaryHeap和 a 中HashSet

当与 一起使用时BinaryHeap,我希望它基于 进行排序value。当与 一起使用时HashSet,我希望它与 一起进行哈希处理id

这两个都需要该特征的实现Eq,但我找不到一种方法来拥有两种不同的Eq.

我发现的最接近的是Rust 中同一类型的相同特征的多个实现,但这似乎只有在该特征接受通用参数时才有效,但事实并非如此Eq

Ale*_*uze 6

不要这样做。在 Rust 中HashEq实现必须相互一致。Hash特征的文档特别指出:

\n
\n

在实现 Hash 和 Eq 时,保持以下属性非常重要:

\n
k1 == k2 -> hash(k1) == hash(k2)\n
Run Code Online (Sandbox Code Playgroud)\n

换句话说,如果两个键相等,那么它们的哈希值也必须相等。HashMap 和 HashSet 都依赖于这种行为。

\n

值得庆幸的是,当使用 #[derive(PartialEq, Eq, Hash)] 派生 Eq 和 Hash 时,\xe2\x80\x99 不需要担心维护此属性。

\n

违反此属性是一个逻辑错误。逻辑错误导致的行为未指定,但特征的用户必须确保此类逻辑错误不会导致未定义的行为。这意味着不安全的代码不能依赖于这些方法的正确性。

\n
\n

使用newtype模式创建两种以不同方式实现Hashand 的类型Eq,并将它们用作HashMapand的元素BinaryHeap元素。

\n
k1 == k2 -> hash(k1) == hash(k2)\n
Run Code Online (Sandbox Code Playgroud)\n