const CRC32_POLY: u32 = 0xEDB8_8320;
const CRC32_TABLE: [u32; 256] = {
let mut table = [0u32; 256];
let mut i = 0usize;
while i < 256 {
let mut c = i as u32;
let mut k = 0;
while k < 8 {
c = if c & 1 != 0 {
CRC32_POLY ^ (c >> 1)
} else {
c >> 1
};
k += 1;
}
table[i] = c;
i += 1;
}
table
};
pub fn crc32(data: &[u8]) -> u32 {
let mut crc = 0xFFFF_FFFFu32;
for &byte in data {
crc = CRC32_TABLE[((crc ^ u32::from(byte)) & 0xFF) as usize] ^ (crc >> 8);
}
crc ^ 0xFFFF_FFFF
}
pub fn adler32(data: &[u8]) -> u32 {
const MOD: u32 = 65_521;
const NMAX: usize = 5552;
let mut a: u32 = 1;
let mut b: u32 = 0;
for chunk in data.chunks(NMAX) {
for &byte in chunk {
a += u32::from(byte);
b += a;
}
a %= MOD;
b %= MOD;
}
(b << 16) | a
}
const FNV1A64_OFFSET: u64 = 0xcbf2_9ce4_8422_2325;
const FNV1A64_PRIME: u64 = 0x0000_0100_0000_01b3;
pub fn fnv1a64(data: &[u8]) -> u64 {
let mut hash = FNV1A64_OFFSET;
for &byte in data {
hash ^= u64::from(byte);
hash = hash.wrapping_mul(FNV1A64_PRIME);
}
hash
}