wiwi_collections/
hash_builder.rs1use core::hash::{ BuildHasher, Hash, Hasher };
2
3pub struct DefaultHashBuilder {
4 inner: ahash::RandomState
5}
6
7impl DefaultHashBuilder {
8 #[inline]
9 pub fn new() -> Self {
10 Self { inner: ahash::RandomState::new() }
11 }
12}
13
14impl BuildHasher for DefaultHashBuilder {
15 type Hasher = DefaultHasher;
16
17 #[inline]
18 fn build_hasher(&self) -> DefaultHasher {
19 DefaultHasher { inner: self.inner.build_hasher() }
20 }
21
22 #[inline]
23 fn hash_one<T: Hash>(&self, x: T) -> u64
24 where
25 Self: Sized
26 {
27 self.inner.hash_one(x)
28 }
29}
30
31impl Default for DefaultHashBuilder {
32 #[inline]
33 fn default() -> Self {
34 Self::new()
35 }
36}
37
38pub struct DefaultHasher {
39 inner: ahash::AHasher
40}
41
42impl Hasher for DefaultHasher {
43 fn finish(&self) -> u64 {
44 self.inner.finish()
45 }
46
47 forward_hasher_to_inner! {
48 fn write(&mut self, bytes: &[u8])(bytes);
49 fn write_u8(&mut self, i: u8)(i);
50 fn write_u16(&mut self, i: u16)(i);
51 fn write_u32(&mut self, i: u32)(i);
52 fn write_u64(&mut self, i: u64)(i);
53 fn write_u128(&mut self, i: u128)(i);
54 fn write_usize(&mut self, i: usize)(i);
55 fn write_i8(&mut self, i: i8)(i);
56 fn write_i16(&mut self, i: i16)(i);
57 fn write_i32(&mut self, i: i32)(i);
58 fn write_i64(&mut self, i: i64)(i);
59 fn write_i128(&mut self, i: i128)(i);
60 fn write_isize(&mut self, i: isize)(i);
61 #[cfg(feature = "nightly")]
62 fn write_length_prefix(&mut self, len: usize)(len);
63 #[cfg(feature = "nightly")]
64 fn write_str(&mut self, s: &str)(s);
65 }
66}
67
68macro_rules! forward_hasher_to_inner {
69 (
70 $(
71 $(#[$meta:meta])*
72 fn $fn:ident
73 (&mut self $($params:tt)*)
74 ($($args:tt)*);
75 )*
76 ) => {
77 $(
78 $(#[$meta])*
79 fn $fn(&mut self $($params)*) {
80 self.inner.$fn($($args)*)
81 }
82 )*
83 }
84}
85use forward_hasher_to_inner;