timecat/utils/
identity_hashmap.rs

1use super::*;
2use std::collections::HashMap;
3use std::hash::BuildHasherDefault;
4
5#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
6#[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Default, Debug, Hash)]
7pub struct IdentityHasher(u64);
8
9impl std::hash::Hasher for IdentityHasher {
10    #[inline]
11    fn finish(&self) -> u64 {
12        self.0
13    }
14
15    #[inline]
16    fn write(&mut self, bytes: &[u8]) {
17        // TODO: Maybe make the logic better?
18        for &byte in bytes {
19            self.0 = (self.0 << 3) ^ byte as u64;
20        }
21    }
22
23    #[inline]
24    fn write_u8(&mut self, i: u8) {
25        self.0 ^= i as u64;
26    }
27
28    #[inline]
29    fn write_u16(&mut self, i: u16) {
30        self.0 ^= i as u64;
31    }
32
33    #[inline]
34    fn write_u32(&mut self, i: u32) {
35        self.0 ^= i as u64;
36    }
37
38    #[inline]
39    fn write_u64(&mut self, i: u64) {
40        self.0 ^= i;
41    }
42
43    #[inline]
44    fn write_u128(&mut self, i: u128) {
45        self.0 ^= i as u64;
46    }
47
48    #[inline]
49    fn write_usize(&mut self, i: usize) {
50        self.0 ^= i as u64;
51    }
52
53    #[inline]
54    fn write_i8(&mut self, i: i8) {
55        self.0 ^= i as u64;
56    }
57
58    #[inline]
59    fn write_i16(&mut self, i: i16) {
60        self.0 ^= i as u64;
61    }
62
63    #[inline]
64    fn write_i32(&mut self, i: i32) {
65        self.0 ^= i as u64;
66    }
67
68    #[inline]
69    fn write_i64(&mut self, i: i64) {
70        self.0 ^= i as u64;
71    }
72
73    #[inline]
74    fn write_i128(&mut self, i: i128) {
75        self.0 ^= i as u64;
76    }
77
78    #[inline]
79    fn write_isize(&mut self, i: isize) {
80        self.0 ^= i as u64;
81    }
82}
83
84pub type IdentityHashMap<K, V> = HashMap<K, V, BuildHasherDefault<IdentityHasher>>;