const POLY: u32 = 0xEDB8_8320;
fn update(mut crc: u32, data: &[u8]) -> u32 {
for &b in data {
crc ^= b as u32;
for _ in 0..8 {
crc = if crc & 1 != 0 {
(crc >> 1) ^ POLY
} else {
crc >> 1
};
}
}
crc
}
pub fn ieee(data: &[u8]) -> u32 {
update(0xFFFF_FFFF, data) ^ 0xFFFF_FFFF
}
pub fn flamberge(data: &[u8]) -> u32 {
update(0x0000_0000, data)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn ieee_known_vector() {
assert_eq!(ieee(b"123456789"), 0xCBF4_3926);
}
#[test]
fn flamberge_is_uninverted() {
assert_ne!(flamberge(b"123456789"), ieee(b"123456789"));
}
}