Skip to main content

pacenotes_installer\zip/
crc32.rs

1/// One entry per byte value, built at compile time: 1 KiB of table. The
2/// nibble-at-a-time version it replaced saved 960 bytes and checked 290 MB/s,
3/// a tenth of a 3 000-file install.
4const TABLE: [u32; 256] = table();
5
6const fn table() -> [u32; 256] {
7    let mut table = [0u32; 256];
8    let mut byte = 0;
9    while byte < 256 {
10        let mut crc = byte as u32;
11        let mut bit = 0;
12        while bit < 8 {
13            crc = if crc & 1 == 1 {
14                (crc >> 1) ^ 0xEDB8_8320
15            } else {
16                crc >> 1
17            };
18            bit += 1;
19        }
20        table[byte] = crc;
21        byte += 1;
22    }
23    table
24}
25
26/// CRC-32 with the zip polynomial.
27pub fn crc32(data: &[u8]) -> u32 {
28    let mut crc = 0xFFFF_FFFFu32;
29    for &byte in data {
30        crc = (crc >> 8) ^ TABLE[((crc ^ byte as u32) & 0xFF) as usize];
31    }
32    !crc
33}