vole/datastructures/
hash.rs

1//! Hashing
2
3use 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
65/// A simple helper to hash any object
66pub 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}