跳到主要内容

CRC32 校验和怎么用:8 位十六进制查错码与 MD5 的区别

讲清 CRC32 循环冗余校验干什么用,怎么核对 ZIP 压缩包和网络传输,以及它和 MD5 的根本区别:CRC32 快,但只查意外错误,挡不住有人故意改文件。

发布于 作者 李雷
#CRC32 #校验和 #循环冗余校验 #文件完整性 #MD5

CRC32 校验和:8 位十六进制查错码到底怎么用

CRC32 是循环冗余校验(Cyclic Redundancy Check)算出的一个 32 位数,写成 8 位十六进制时长这样:CBF43926。你每天都在跟它打交道,只是没察觉。解压一个 ZIP 包、加载一张 PNG 图片、网卡收下一个以太网帧,背后都有一次 CRC32 比对在悄悄确认字节没坏。这篇我把它讲透:它干什么用,结果怎么读,以及那个很多人踩坑的问题,它和 MD5 到底差在哪。

CRC32 是什么:一个便宜的查错码

循环冗余校验的思路很朴素。把数据当成一个超长的二进制数,除以一个固定的多项式,余数就是校验和。标准 CRC-32(也就是 IEEE 802.3 那一版)用的多项式是 0xEDB88320,初值 0xFFFFFFFF,最后再异或一次 0xFFFFFFFF。这套框架钉死之后,同一段数据在任何正确实现里算出来都一模一样。

它最大的好处是快,而且只要数据里有一位翻转,余数几乎一定变。所以它特别适合一件事:发现意外损坏。坏块、传输噪声、截断的下载,这些随机错误它抓得又准又便宜。

三个最常见的用途

第一个是文件完整性校验。镜像站在文件旁边列一个 CRC-32,你下载完自己算一遍,两个 8 位十六进制对得上,就说明字节完好到达;对不上,要么下载被截断,要么中途出错,重新拉一次再用。

第二个是压缩包里的查错。每个 ZIP 和 gzip 条目都存着原始字节的 CRC-32,解压时解压器拿它核对,确认解出来的内容跟压缩前一致。调试自己写的打包工具时,把解压后的文本算一遍,跟头部存的值对比,就知道字段写没写对。

第三个是网络传输查错。以太网帧尾带一个 CRC-32,网卡收到包先验一遍,被噪声污染的就直接丢掉,根本不往上送。你用浏览器看网页时,这一层每秒都在跑无数次。

一个真实例子:字符串 hello

光说不练没感觉,直接算一个。字符串 hello 按 UTF-8 字节读进去,标准 CRC-32 的结果是 0x3610A686,换成无符号十进制是 907060870。再换个经典的:字符串 123456789 算出来正好是 0xCBF43926,这是 CRC-32 的标准校验值,每个正确实现都必须算出这个常数。如果你手上的工具对 123456789 给不出 0xCBF43926,那它的框架选择(初值、是否反射、要不要最后异或)跟标准不一样,别拿它的结果去跟别人比。

你可以打开 CRC32 校验和计算器 自己粘个文本验一下,十六进制和十进制两种结果它都给,中文和 emoji 也照样按字节算。

CRC32 和 MD5 的区别:这是重点

我自己早年踩过一个坑:以为校验和对上就等于文件没被人动过。那时候做一个内部分发系统,文件旁边挂的是 CRC32,我天真地把它当防篡改用。后来才搞明白,这是两件完全不同的事。

CRC-32 产出 32 位,8 位十六进制;MD5 产出 128 位,32 位十六进制。长度差着远不只是数字大小的问题,核心区别在用途。CRC-32 是非加密校验和,设计目标是发现意外损坏;MD5 设计上是加密指纹,目标是给内容一个难以伪造的身份。

关键的一句:CRC-32 只查意外错误,挡不住蓄意篡改。算法完全公开,给定任意一段内容,攻击者可以轻松构造另一段 CRC 相同的内容,或者追加几个字节把校验值凑成任意目标。所以下载时 CRC 对上,只能说明字节在传输里没被搞乱,绝不代表没人故意改过。把 CRC-32 当烟雾报警器,别当锁。

真要证明文件没被篡改,得用加密哈希,而且 MD5 本身也早被攻破了,该上 SHA-256。需要内容指纹时,可以用 MD5/SHA 哈希计算器 同时算 MD5 和 SHA-256 对比着看。一句话记法:查传输错误用 CRC-32,证明没被改用 SHA-256。

顺带提一句 CRC32C

还有个变体叫 CRC32C,用的是 Castagnoli 多项式(反射形式 0x82F63B78),不是 IEEE 的 0xEDB88320。它对某些突发错误检测得稍好,更关键的是现代 CPU 用 SSE4.2 的 crc32 指令直接实现,硬件上飞快,所以 ext4 元数据、Btrfs、iSCSI 都用它。它的校验值跟 IEEE 不一样:123456789 在 CRC32C 下是 0xE3069283,不是 0xCBF43926。移植代码时两个系统都说自己是 CRC32 数却对不上,八成就是一个 IEEE 一个 Castagnoli,确认清楚目标系统要的是哪个再换多项式。

小结

CRC-32 是一个又快又便宜的查错码,专治意外损坏:下载坏没坏、压缩包完不完整、网络包脏不脏,它都管得了。但它不是安全防线,挡不住有人故意改文件。记住这条边界,该用它的地方放心用,该上 SHA-256 的地方别偷懒,就不会出错。


Made by Toolora · Updated 2026-06-13