G.TRA.BLN.04 在使用#[derive(Hash)] 的时候,避免再手工实现 PartialEq
【级别】 要求
【描述】
实现 Hash 和 Eq 必须要满足下面一个等式:
k1 == k2 -> hash(k1) == hash(k2)
即,当k1 和 k2 相等时,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 name | Clippy 可检测 | Rustc 可检测 | Lint Group | level |
|---|---|---|---|---|
| derive_hash_xor_eq | yes | no | correctness | deny |