Do not do this.在Rust Hash
和Eq
中,实现必须彼此一致.Hash个性状的记录特别写道:
同时实现Hash和Eq时,重要的是满足以下属性:
k1 == k2 -> hash(k1) == hash(k2)
换句话说,如果两个键相等,则它们的散列也必须相等.HashMap和HashSet都依赖于此行为.
值得庆幸的是,在使用#[Derate(PartialEq,Eq,Hash)]派生Eq和Hash时,您不需要担心维护此属性.
Violating this property is a logic error.未指定逻辑错误导致的行为,但特征的用户必须确保此类逻辑错误不会导致未定义的行为.这意味着不安全的代码不能依赖于这些方法的正确性.
使用newtype模式创建以不同方式实现Hash
和Eq
的两个类型,并将它们用作HashMap
和BinaryHeap
的元素.
struct Obj {
id: i32,
value: i64,
}
// implement `Hash` that will hash `self.0.id`.
struct ObjHash(Obj);
// implement `Eq` that will compare `self.0.value`.
struct ObjEq(Obj);
fn foo() {
let hash_map: HashMap<ObjHash> = todo!();
let bin_heap: BinaryHeap<ObjEq> = todo!();
}