From 0aa9d8be86cea8e0d5dd706004543928edfbdbdd Mon Sep 17 00:00:00 2001 From: Fabian Schmidt Date: Wed, 28 Aug 2024 11:32:35 +0200 Subject: [PATCH] changed hash to add debug mode --- src/main/rust/src/utils/hash.rs | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/src/main/rust/src/utils/hash.rs b/src/main/rust/src/utils/hash.rs index 625474a..a17fb02 100644 --- a/src/main/rust/src/utils/hash.rs +++ b/src/main/rust/src/utils/hash.rs @@ -1,12 +1,26 @@ #[inline] pub fn bytes(bytes: &[u8]) -> u64 { - // inspired by https://curiouscoding.nl/posts/1brc/ - let head: [u8; 8] = unsafe { bytes.get_unchecked(..8).as_chunks::<8>().0[0] }; - let tail: [u8; 8] = unsafe { bytes.get_unchecked(bytes.len() - 8..).as_chunks::<8>().0[0] }; - let shift = 64usize.saturating_sub(8 * bytes.len()); - let khead = u64::from_ne_bytes(head) << shift; - let ktail = u64::from_ne_bytes(tail) >> shift; - khead + ktail + if cfg!(not(debug_assertions)) { + // inspired by https://curiouscoding.nl/posts/1brc/ + let head: [u8; 8] = unsafe { bytes.get_unchecked(..8).as_chunks::<8>().0[0] }; + let tail: [u8; 8] = unsafe { bytes.get_unchecked(bytes.len() - 8..).as_chunks::<8>().0[0] }; + let shift = 64usize.saturating_sub(8 * bytes.len()); + let khead = u64::from_ne_bytes(head) << shift; + let ktail = u64::from_ne_bytes(tail) >> shift; + khead + ktail + } else { + // debug friendly but slow + let mut head = [0u8; 8]; + let mut tail = [0u8; 8]; + let end = bytes.len().min(8); + let start = bytes.len().saturating_sub(8); + head[..end].copy_from_slice(&bytes[..end]); + tail[..end].copy_from_slice(&bytes[start..]); + let shift = 64usize.saturating_sub(8 * bytes.len()); + let khead = u64::from_ne_bytes(head) << shift; + let ktail = u64::from_ne_bytes(tail) >> shift; + khead.wrapping_add(ktail) + } } #[cfg(test)]