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}