Skip to main content

compress/checksum/
adler.rs

1/*!
2
3Adler-32 checksum
4
5This implementation is based off the example found at
6http://en.wikipedia.org/wiki/Adler-32.
7
8# Example
9
10```rust
11use compress::checksum::adler;
12let mut state = adler::State32::new();
13state.feed(b"abracadabra");
14let checksum = state.result();
15```
16
17*/
18
19const MOD_ADLER: u32 = 65521;
20
21/// Adler state for 32 bits
22pub struct State32 {
23    a: u32,
24    b: u32,
25}
26
27impl State32 {
28    /// Create a new state
29    pub fn new() -> State32 {
30        State32 { a: 1, b: 0 }
31    }
32
33    /// Mutate the state for given data
34    pub fn feed(&mut self, buf: &[u8]) {
35        for byte in buf.iter() {
36            self.a = (self.a + *byte as u32) % MOD_ADLER;
37            self.b = (self.a + self.b) % MOD_ADLER;
38        }
39    }
40
41    /// Get checksum
42    pub fn result(&self) -> u32 {
43        (self.b << 16) | self.a
44    }
45
46    /// Reset the state
47    pub fn reset(&mut self) {
48        self.a = 1;
49        self.b = 0;
50    }
51}