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