#[allow(dead_code)]
pub fn adler32(data: &[u8]) -> u32 {
const MOD_ADLER: u64 = 65521;
let mut s1: u64 = 1;
let mut s2: u64 = 0;
for &byte in data {
s1 += byte as u64;
s2 += s1;
}
s1 %= MOD_ADLER;
s2 %= MOD_ADLER;
((s2 << 16) | s1) as u32
}
pub const MOD_ADLER: u64 = 65521;
pub fn adler32_stream_update(s1: &mut u64, s2: &mut u64, data: &[u8]) {
for &byte in data {
*s1 = (*s1 + byte as u64) % MOD_ADLER;
*s2 = (*s2 + *s1) % MOD_ADLER;
}
}
pub fn adler32_stream_finalize(s1: u64, s2: u64) -> u32 {
((s2 << 16) | s1) as u32
}
use std::io::{self, Read};
#[allow(dead_code)]
pub fn adler32_stream<R: Read>(reader: &mut R) -> io::Result<(u32, u64)> {
let mut s1: u64 = 1;
let mut s2: u64 = 0;
let mut original_size: u64 = 0;
let mut buffer = [0; 4096];
loop {
let bytes_read = reader.read(&mut buffer)?;
if bytes_read == 0 {
break; }
adler32_stream_update(&mut s1, &mut s2, &buffer[..bytes_read]);
original_size += bytes_read as u64;
}
Ok((adler32_stream_finalize(s1, s2), original_size))
}