#[inline(never)]
pub fn eq(a: &[u8], b: &[u8]) -> bool {
if a.len() != b.len() {
return false;
}
let mut diff = 0u8;
for (x, y) in a.iter().zip(b) {
diff |= x ^ y;
}
is_zero(diff)
}
#[inline(never)]
fn is_zero(diff: u8) -> bool {
let z = (diff as u16).wrapping_sub(1) >> 8;
(z & 1) == 1
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn compares_every_octet() {
let a = [0x55u8; 64];
assert!(eq(&a, &a));
assert!(eq(&[], &[]));
for i in 0..64 {
for bit in 0..8 {
let mut b = a;
b[i] ^= 1 << bit;
assert!(!eq(&a, &b));
}
}
assert!(!eq(&a[..63], &a));
}
#[test]
fn is_zero_all_values() {
for v in 0..=255u8 {
assert_eq!(is_zero(v), v == 0);
}
}
}