| Crates.io | discriminant_hash_derive |
| lib.rs | discriminant_hash_derive |
| version | 0.1.0 |
| created_at | 2021-06-11 11:29:52.494204+00 |
| updated_at | 2021-06-11 11:29:52.494204+00 |
| description | Derive macro to implement Hash trait based on enum's discriminants only and ignore variant's fields |
| homepage | |
| repository | https://github.com/MihirLuthra/discriminant_hash_derive |
| max_upload_size | |
| id | 408960 |
| size | 7,160 |
Deriving DiscriminantHash implements Hash trait for the underlying enum.
Here hash is only dependent on discriminant and isn’t effected by variant’s fields.
use discriminant_hash_derive::DiscriminantHash;
use std::{
collections::hash_map::DefaultHasher,
hash::{Hash, Hasher},
};
#[derive(DiscriminantHash)]
enum Abc<T> {
Simple,
HashNotImplemented(Xyz),
Generic(T),
}
#[allow(unused)]
#[derive(Hash)]
enum Pqr<'a> {
Simple,
Lifetime(&'a str),
}
// Xyz doesn't impl Hash
struct Xyz;
fn main() {
assert_eq!(my_hash(Abc::Simple::<i32>), my_hash(Abc::Simple::<Xyz>));
assert_eq!(
my_hash(Abc::HashNotImplemented::<i32>(Xyz)),
my_hash(Abc::HashNotImplemented::<String>(Xyz))
);
assert_eq!(
my_hash(Abc::Generic::<i32>(4)),
my_hash(Abc::Generic::<Xyz>(Xyz))
);
assert_ne!(
my_hash(Abc::Simple::<i32>),
my_hash(Abc::Generic::<Xyz>(Xyz))
);
// This may be same depending on how Pqr is defined
// assert_eq!(
// my_hash(Abc::Simple::<i32>),
// my_hash(Pqr::Simple)
// );
}
fn my_hash<T>(obj: T) -> u64
where
T: Hash,
{
let mut hasher = DefaultHasher::new();
obj.hash(&mut hasher);
hasher.finish()
}