1#[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
14const 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 assert_eq!(crc32(&[]), 0x0000_0000);
282 assert_eq!(crc32(b"123456789"), 0xCBF4_3926);
284 }
285
286 #[test]
287 fn test_crc32_various_inputs() {
288 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}