CRC-32 用多项式除法给数据算出一个 32 位校验值,用来发现传输或存储中的随机比特错误。它检错能力强、算得快,被 zlib / gzip、PNG、ZIP、以太网帧、Ethernet FCS 等广泛采用。它不是密码学哈希,能被人为构造碰撞,不能用于校验文件是否被恶意篡改(那要用 SHA-256)。
一个 CRC-32 算法由 5 个参数确定:多项式 Poly、初始值 Init、结果异或 XorOut、输入反射 RefIn、输出反射 RefOut。参数不同结果完全不同。
123456789 的 CRC,并与该算法的标准检查值比对(✔ / ✘),确认选对了算法。DE AD BE EF)、Base64,也可直接选文件。0x 前缀可选)、无符号十进制、有符号十进制(32 位补码)。全部在浏览器本地计算,数据不上传。
| 名称 | Poly | Init | XorOut | RefIn/Out | 检查值(123456789) |
|---|---|---|---|---|---|
| ISO-HDLC (zlib/PNG/ZIP) | 0x04C11DB7 | 0xFFFFFFFF | 0xFFFFFFFF | true | 0xCBF43926 |
| CRC-32C (Castagnoli) | 0x1EDC6F41 | 0xFFFFFFFF | 0xFFFFFFFF | true | 0xE3069283 |
| BZIP2 | 0x04C11DB7 | 0xFFFFFFFF | 0xFFFFFFFF | false | 0xFC891918 |
| MPEG-2 | 0x04C11DB7 | 0xFFFFFFFF | 0x00000000 | false | 0x0376E6E7 |
| POSIX (cksum) | 0x04C11DB7 | 0x00000000 | 0xFFFFFFFF | false | 0x765E7680 |
crc32() 函数对齐,用 ISO-HDLC。Q:为什么和 Python zlib.crc32 / 在线其它工具结果不一样?
A:多数是参数不同或输入编码不同。zlib.crc32、binascii.crc32、大多数语言的标准库都是 ISO-HDLC 预设。中文文本要确认两边都按 UTF-8。
Q:CRC-32 能当文件完整性校验吗? A:能发现传输损坏,但不能防篡改 —— CRC 可被人为构造碰撞。要防篡改用 SHA-256。
Q:POSIX 预设和 cksum 命令结果对不上?
A:cksum 在数据末尾还会追加文件长度的字节再算 CRC,本工具的 POSIX 预设只算你给的数据本身,不追加长度。
Q:有符号十进制是什么?
A:把 32 位结果按补码解释成带符号整数,Java 的 CRC32.getValue() 返回 long 是无符号的,但有些语言/字段是 int,会显示成负数,这一栏方便对照。
Q:能校验大文件吗? A:能,选文件即可。大文件会一次性读入内存,处理全程在本地。