Skip to main content

alimentar/format/
crc.rs

1//! CRC32 checksum utilities.
2
3/// CRC32 checksum calculation (IEEE polynomial)
4#[must_use]
5pub fn crc32(data: &[u8]) -> u32 {
6    let mut crc: u32 = 0xFFFF_FFFF;
7    for byte in data {
8        let index = ((crc ^ u32::from(*byte)) & 0xFF) as usize;
9        crc = CRC32_TABLE[index] ^ (crc >> 8);
10    }
11    !crc
12}
13
14/// CRC32 lookup table (IEEE polynomial 0xEDB88320)
15const CRC32_TABLE: [u32; 256] = [
16    0x0000_0000,
17    0x7707_3096,
18    0xEE0E_612C,
19    0x9909_51BA,
20    0x076D_C419,
21    0x706A_F48F,
22    0xE963_A535,
23    0x9E64_95A3,
24    0x0EDB_8832,
25    0x79DC_B8A4,
26    0xE0D5_E91E,
27    0x97D2_D988,
28    0x09B6_4C2B,
29    0x7EB1_7CBD,
30    0xE7B8_2D07,
31    0x90BF_1D91,
32    0x1DB7_1064,
33    0x6AB0_20F2,
34    0xF3B9_7148,
35    0x84BE_41DE,
36    0x1ADA_D47D,
37    0x6DDD_E4EB,
38    0xF4D4_B551,
39    0x83D3_85C7,
40    0x136C_9856,
41    0x646B_A8C0,
42    0xFD62_F97A,
43    0x8A65_C9EC,
44    0x1401_5C4F,
45    0x6306_6CD9,
46    0xFA0F_3D63,
47    0x8D08_0DF5,
48    0x3B6E_20C8,
49    0x4C69_105E,
50    0xD560_41E4,
51    0xA267_7172,
52    0x3C03_E4D1,
53    0x4B04_D447,
54    0xD20D_85FD,
55    0xA50A_B56B,
56    0x35B5_A8FA,
57    0x42B2_986C,
58    0xDBBB_C9D6,
59    0xACBC_F940,
60    0x32D8_6CE3,
61    0x45DF_5C75,
62    0xDCD6_0DCF,
63    0xABD1_3D59,
64    0x26D9_30AC,
65    0x51DE_003A,
66    0xC8D7_5180,
67    0xBFD0_6116,
68    0x21B4_F4B5,
69    0x56B3_C423,
70    0xCFBA_9599,
71    0xB8BD_A50F,
72    0x2802_B89E,
73    0x5F05_8808,
74    0xC60C_D9B2,
75    0xB10B_E924,
76    0x2F6F_7C87,
77    0x5868_4C11,
78    0xC161_1DAB,
79    0xB666_2D3D,
80    0x76DC_4190,
81    0x01DB_7106,
82    0x98D2_20BC,
83    0xEFD5_102A,
84    0x71B1_8589,
85    0x06B6_B51F,
86    0x9FBF_E4A5,
87    0xE8B8_D433,
88    0x7807_C9A2,
89    0x0F00_F934,
90    0x9609_A88E,
91    0xE10E_9818,
92    0x7F6A_0DBB,
93    0x086D_3D2D,
94    0x9164_6C97,
95    0xE663_5C01,
96    0x6B6B_51F4,
97    0x1C6C_6162,
98    0x8565_30D8,
99    0xF262_004E,
100    0x6C06_95ED,
101    0x1B01_A57B,
102    0x8208_F4C1,
103    0xF50F_C457,
104    0x65B0_D9C6,
105    0x12B7_E950,
106    0x8BBE_B8EA,
107    0xFCB9_887C,
108    0x62DD_1DDF,
109    0x15DA_2D49,
110    0x8CD3_7CF3,
111    0xFBD4_4C65,
112    0x4DB2_6158,
113    0x3AB5_51CE,
114    0xA3BC_0074,
115    0xD4BB_30E2,
116    0x4ADF_A541,
117    0x3DD8_95D7,
118    0xA4D1_C46D,
119    0xD3D6_F4FB,
120    0x4369_E96A,
121    0x346E_D9FC,
122    0xAD67_8846,
123    0xDA60_B8D0,
124    0x4404_2D73,
125    0x3303_1DE5,
126    0xAA0A_4C5F,
127    0xDD0D_7CC9,
128    0x5005_713C,
129    0x2702_41AA,
130    0xBE0B_1010,
131    0xC90C_2086,
132    0x5768_B525,
133    0x206F_85B3,
134    0xB966_D409,
135    0xCE61_E49F,
136    0x5EDE_F90E,
137    0x29D9_C998,
138    0xB0D0_9822,
139    0xC7D7_A8B4,
140    0x59B3_3D17,
141    0x2EB4_0D81,
142    0xB7BD_5C3B,
143    0xC0BA_6CAD,
144    0xEDB8_8320,
145    0x9ABF_B3B6,
146    0x03B6_E20C,
147    0x74B1_D29A,
148    0xEAD5_4739,
149    0x9DD2_77AF,
150    0x04DB_2615,
151    0x73DC_1683,
152    0xE363_0B12,
153    0x9464_3B84,
154    0x0D6D_6A3E,
155    0x7A6A_5AA8,
156    0xE40E_CF0B,
157    0x9309_FF9D,
158    0x0A00_AE27,
159    0x7D07_9EB1,
160    0xF00F_9344,
161    0x8708_A3D2,
162    0x1E01_F268,
163    0x6906_C2FE,
164    0xF762_575D,
165    0x8065_67CB,
166    0x196C_3671,
167    0x6E6B_06E7,
168    0xFED4_1B76,
169    0x89D3_2BE0,
170    0x10DA_7A5A,
171    0x67DD_4ACC,
172    0xF9B9_DF6F,
173    0x8EBE_EFF9,
174    0x17B7_BE43,
175    0x60B0_8ED5,
176    0xD6D6_A3E8,
177    0xA1D1_937E,
178    0x38D8_C2C4,
179    0x4FDF_F252,
180    0xD1BB_67F1,
181    0xA6BC_5767,
182    0x3FB5_06DD,
183    0x48B2_364B,
184    0xD80D_2BDA,
185    0xAF0A_1B4C,
186    0x3603_4AF6,
187    0x4104_7A60,
188    0xDF60_EFC3,
189    0xA867_DF55,
190    0x316E_8EEF,
191    0x4669_BE79,
192    0xCB61_B38C,
193    0xBC66_831A,
194    0x256F_D2A0,
195    0x5268_E236,
196    0xCC0C_7795,
197    0xBB0B_4703,
198    0x2202_16B9,
199    0x5505_262F,
200    0xC5BA_3BBE,
201    0xB2BD_0B28,
202    0x2BB4_5A92,
203    0x5CB3_6A04,
204    0xC2D7_FFA7,
205    0xB5D0_CF31,
206    0x2CD9_9E8B,
207    0x5BDE_AE1D,
208    0x9B64_C2B0,
209    0xEC63_F226,
210    0x756A_A39C,
211    0x026D_930A,
212    0x9C09_06A9,
213    0xEB0E_363F,
214    0x7207_6785,
215    0x0500_5713,
216    0x95BF_4A82,
217    0xE2B8_7A14,
218    0x7BB1_2BAE,
219    0x0CB6_1B38,
220    0x92D2_8E9B,
221    0xE5D5_BE0D,
222    0x7CDC_EFB7,
223    0x0BDB_DF21,
224    0x86D3_D2D4,
225    0xF1D4_E242,
226    0x68DD_B3F8,
227    0x1FDA_836E,
228    0x81BE_16CD,
229    0xF6B9_265B,
230    0x6FB0_77E1,
231    0x18B7_4777,
232    0x8808_5AE6,
233    0xFF0F_6A70,
234    0x6606_3BCA,
235    0x1101_0B5C,
236    0x8F65_9EFF,
237    0xF862_AE69,
238    0x6169_FFD3,
239    0x166E_CF45,
240    0xA00A_E278,
241    0xD70D_D2EE,
242    0x4E04_8354,
243    0x3903_B3C2,
244    0xA767_2661,
245    0xD060_16F7,
246    0x4969_474D,
247    0x3E6E_77DB,
248    0xAED1_6A4A,
249    0xD9D6_5ADC,
250    0x40DF_0B66,
251    0x37D8_3BF0,
252    0xA9BC_AE53,
253    0xDEBB_9EC5,
254    0x47B2_CF7F,
255    0x30B5_FFE9,
256    0xBDBD_F21C,
257    0xCABA_C28A,
258    0x53B3_9330,
259    0x24B4_A3A6,
260    0xBAD0_3605,
261    0xCDD7_0693,
262    0x54DE_5729,
263    0x23D9_67BF,
264    0xB366_7A2E,
265    0xC461_4AB8,
266    0x5D68_1B02,
267    0x2A6F_2B94,
268    0xB40B_BE37,
269    0xC30C_8EA1,
270    0x5A05_DF1B,
271    0x2D02_EF8D,
272];
273
274#[cfg(test)]
275mod tests {
276    use super::*;
277
278    #[test]
279    fn test_crc32_known_values() {
280        // Empty
281        assert_eq!(crc32(&[]), 0x0000_0000);
282        // "123456789"
283        assert_eq!(crc32(b"123456789"), 0xCBF4_3926);
284    }
285
286    #[test]
287    fn test_crc32_various_inputs() {
288        // Verify CRC is different for different inputs
289        let crc1 = crc32(b"hello");
290        let crc2 = crc32(b"world");
291        let crc3 = crc32(b"helloworld");
292
293        assert_ne!(crc1, crc2);
294        assert_ne!(crc2, crc3);
295        assert_ne!(crc1, crc3);
296    }
297}