xref: /DragonOS/kernel/crates/intertrait/src/hasher.rs (revision bd70d2d1f490aabd570a5301b858bd5eb04149fa)
1*bd70d2d1SLoGin use core::convert::TryInto;
2*bd70d2d1SLoGin use core::hash::{BuildHasherDefault, Hasher};
3*bd70d2d1SLoGin use core::mem::size_of;
4*bd70d2d1SLoGin 
5*bd70d2d1SLoGin /// A simple `Hasher` implementation tuned for performance.
6*bd70d2d1SLoGin #[derive(Default)]
7*bd70d2d1SLoGin pub struct FastHasher(u64);
8*bd70d2d1SLoGin 
9*bd70d2d1SLoGin /// A `BuildHasher` for `FastHasher`.
10*bd70d2d1SLoGin pub type BuildFastHasher = BuildHasherDefault<FastHasher>;
11*bd70d2d1SLoGin 
12*bd70d2d1SLoGin impl Hasher for FastHasher {
finish(&self) -> u6413*bd70d2d1SLoGin     fn finish(&self) -> u64 {
14*bd70d2d1SLoGin         self.0
15*bd70d2d1SLoGin     }
16*bd70d2d1SLoGin 
write(&mut self, bytes: &[u8])17*bd70d2d1SLoGin     fn write(&mut self, bytes: &[u8]) {
18*bd70d2d1SLoGin         let mut bytes = bytes;
19*bd70d2d1SLoGin         while bytes.len() > size_of::<u64>() {
20*bd70d2d1SLoGin             let (u64_bytes, remaining) = bytes.split_at(size_of::<u64>());
21*bd70d2d1SLoGin             self.0 ^= u64::from_ne_bytes(u64_bytes.try_into().unwrap());
22*bd70d2d1SLoGin             bytes = remaining
23*bd70d2d1SLoGin         }
24*bd70d2d1SLoGin         self.0 ^= bytes
25*bd70d2d1SLoGin             .iter()
26*bd70d2d1SLoGin             .fold(0u64, |result, b| (result << 8) | *b as u64);
27*bd70d2d1SLoGin     }
28*bd70d2d1SLoGin }
29