timecat/utils/
identity_hashmap.rs1use 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 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>>;