vole/datastructures/
hash.rs1use std::{
4 hash::{Hash, Hasher},
5 num::Wrapping,
6};
7
8pub type QHash = u64;
9
10pub trait QuickHashable {
11 fn quick_hash(&self) -> Wrapping<QHash>;
12}
13
14impl<T: QuickHashable + Copy> QuickHashable for &T {
15 fn quick_hash(&self) -> Wrapping<QHash> {
16 (*self).quick_hash()
17 }
18}
19
20impl QuickHashable for usize {
21 fn quick_hash(&self) -> Wrapping<QHash> {
22 let hash = seahash::hash(&self.to_le_bytes()) as QHash;
23 Wrapping(hash)
24 }
25}
26
27impl QuickHashable for isize {
28 fn quick_hash(&self) -> Wrapping<QHash> {
29 let hash = seahash::hash(&self.to_le_bytes()) as QHash;
30 Wrapping(hash)
31 }
32}
33
34impl QuickHashable for Wrapping<QHash> {
35 fn quick_hash(&self) -> Wrapping<QHash> {
36 let hash = seahash::hash(&self.0.to_le_bytes()) as QHash;
37 Self(hash)
38 }
39}
40
41impl QuickHashable for bool {
42 fn quick_hash(&self) -> Wrapping<QHash> {
43 Wrapping(if *self { 123456789 } else { 987654321 })
44 }
45}
46
47impl QuickHashable for (usize, Wrapping<QHash>) {
48 fn quick_hash(&self) -> Wrapping<QHash> {
49 let (a, b) = &self;
50 let hasha = seahash::hash(&a.to_le_bytes()) as QHash;
51 let hashb = seahash::hash(&b.0.to_le_bytes()) as QHash;
52 Wrapping(hasha) * Wrapping(hashb)
53 }
54}
55
56impl QuickHashable for (Wrapping<QHash>, usize) {
57 fn quick_hash(&self) -> Wrapping<QHash> {
58 let (a, b) = &self;
59 let hasha = seahash::hash(&a.0.to_le_bytes()) as QHash;
60 let hashb = seahash::hash(&b.to_le_bytes()) as QHash;
61 Wrapping(hasha) * Wrapping(hashb)
62 }
63}
64
65pub fn do_hash<T>(obj: T) -> Wrapping<QHash>
67where
68 T: Hash,
69{
70 let mut hasher = seahash::SeaHasher::default();
71 obj.hash(&mut hasher);
72 Wrapping(hasher.finish() as QHash)
73}