G.TRA.BLN.04 在使用#[derive(Hash)] 的时候,避免再手工实现 PartialEq

【级别】 要求

【描述】

实现 Hash 和 Eq 必须要满足下面一个等式:

k1 == k2  -> hash(k1) == hash(k2)

即,当k1k2 相等时,hash(k1)也应该和 hash(k2) 相等。 所以要求 PartialEq / Eq / Hash 的实现必须保持一致。

如果用 #[derive(Hash)] 的时候,搭配了一个手工实现的 PartialEq 就很可能出现不一致的情况。

但也有例外。

【反例】


#![allow(unused)]
fn main() {
#[derive(Hash)]
struct Foo;
// 不符合
impl PartialEq for Foo {
    ...
}
}

【正例】


#![allow(unused)]
fn main() {
// 符合
#[derive(PartialEq, Eq, Hash)]
struct Foo;
}

【例外】


#![allow(unused)]
fn main() {
// From: https://docs.rs/crate/blsttc/3.3.0/source/src/lib.rs

// Clippy warns that it's dangerous to derive `PartialEq` and explicitly implement `Hash`, but the
// `pairing::bls12_381` types don't implement `Hash`, so we can't derive it.
#![allow(clippy::derive_hash_xor_eq)]
}

【Lint 检测】

lint nameClippy 可检测Rustc 可检测Lint Grouplevel
derive_hash_xor_eqyesnocorrectnessdeny