wy 1.1.2

Rust implementation of wyhash algorithms
Documentation
use core::{mem, ptr};

#[cfg(debug_assertions)]
#[inline(always)]
pub fn read_u8(data: &[u8], idx: usize) -> u8 {
    data[idx]
}

#[cfg(not(debug_assertions))]
#[inline(always)]
pub fn read_u8(data: &[u8], idx: usize) -> u8 {
    unsafe {
        *data.get_unchecked(idx)
    }
}

#[inline(always)]
pub fn read_u32(data: &[u8]) -> u32 {
    let mut result = mem::MaybeUninit::<u32>::uninit();
    unsafe {
        ptr::copy_nonoverlapping(data.as_ptr(), &mut result as *mut _ as *mut u8, mem::size_of::<u32>());
        result.assume_init().to_le()
    }
}


#[inline(always)]
pub fn read_part_u32(data: &[u8]) -> u32 {
    ((read_u8(data, 0) as u32) << 16) | (read_u8(data, data.len() >> 1) as u32 ) | read_u8(data, data.len() - 1) as u32
}

#[inline(always)]
pub fn read_u64(data: &[u8], offset: isize) -> u64 {
    let mut result = mem::MaybeUninit::<u64>::uninit();
    unsafe {
        ptr::copy_nonoverlapping(data.as_ptr().offset(offset), &mut result as *mut _ as *mut u8, mem::size_of::<u64>());
        result.assume_init().to_le()
    }
}

#[inline(always)]
pub fn mix(mut left: u64, mut right: u64) -> u64 {
    let mix = u128::from(left) * u128::from(right);
    left = mix as u64;
    right = (mix >> 64) as u64;
    left ^ right
}