校验和(checksum)是什么?
校验和(checksum)是根据一块数据(比如一个文件或一个网络数据包)计算出的一个简短值,它会和数据一起存储或发送。之后重新计算一次并比较两个值,就能知道数据是否因损坏或传输错误而发生了变化。
更新于 2026年9月24日
| 校验和 | 发送 | 收到 | 结果 |
|---|---|---|---|
| 字节之和(模 256) | DD | DD | 一致 |
| CRC-32 | E7A51913 | E7A51913 | 一致 |
翻转一个比特,两种校验和都会改变。交换两个字符时,所有字节都还在,所以它们的和不变:只有依赖顺序的 CRC-32 能发现问题。
Ubuntu、Debian 等 Linux 发行版会在安装镜像旁边发布一个名为 SHA256SUMS 的文件。文件里每一行是一个 64 个字符的字符串和一个文件名。下载完成后,你对收到的文件运行一条命令。如果它输出的字符串和文件里的一样,说明几十亿个字节全都完好无损地到达了。如果途中有哪怕一个比特发生了翻转,得到的字符串就会完全不同。
这个字符串就是校验和:一份会随数据变化而变化的小摘要。
校验和的工作原理
- 发送方对数据逐字节运行校验和算法,得到一个简短的结果。
- 这个结果随数据一起传输或存储:放在网络数据包的头部,放在 ZIP 文件中每个压缩文件的旁边,或者写在下载页面上。
- 接收方对实际收到的数据运行同样的算法。
- 比较两个结果。如果相等,数据几乎可以肯定没有变化。如果不同,说明数据已经损坏,接收方会拒绝它、请求重新发送,或者显示校验和错误。
校验和只能发现损坏,无法指出是哪个字节变了,也无法修复它。修复需要纠错码,比如 CD 和二维码上使用的 Reed-Solomon 码。
最简单的校验和是把所有字节加起来,只保留总和的最后 8 位。运行下面的代码,看看这个思路在哪里有效、在哪里会失效:
original sum= 78 crc32=a1628836
flipped sum= 80 crc32=a597580b
swapped sum= 78 crc32=59dbf74b
改掉一个字符,总和就变了。但交换两个字符时总和不变,因为加法不在乎顺序,于是按字节求和的校验会放行一笔 10 元而不是 100 元的付款。CRC-32(循环冗余校验)把数据看作一个很长的二进制数,用一个固定的 33 位多项式去除它;得到的 32 位余数取决于每个比特所在的位置,所以交换也能被发现。上面的示例可以让你用自己的文本试一试。CRC-32 能发现任何长度不超过 32 位的突发错误。
常见的校验和算法
| 算法 | 大小 | 在哪里会遇到 |
|---|---|---|
| 奇偶校验位 | 1 位 | 串行连接、奇偶校验内存 |
| Luhn 校验位 | 1 位数字 | 银行卡号、IMEI 号 |
| 互联网校验和 | 16 位 | IPv4、TCP 和 UDP 头部 |
| Adler-32 | 32 位 | zlib 压缩格式 |
| CRC-32 | 32 位 | ZIP、gzip、PNG、以太网帧 |
| MD5 | 128 位 | 较老的下载页面、重复文件查找工具 |
| SHA-256 | 256 位 | 软件下载、Linux 镜像、比特币 |
前五种只能发现意外损坏,挡不住攻击者。修改文件的人可以调整几个字节,让它的 CRC-32 重新匹配。MD5 和 SHA-256 是密码学哈希函数,设计目标是让人实际上无法找到两个输出相同的输入。MD5 后来被攻破了(2004 年公布了碰撞),SHA-1 也一样(2017 年),所以对安全要求高的下载使用 SHA-256 或更强的算法。不过,MD5 用来发现意外损坏仍然完全够用。
如何验证校验和
在你自己的电脑上,每个操作系统都有内置命令:
# Windows (PowerShell)
Get-FileHash ubuntu.iso -Algorithm SHA256
# macOS
shasum -a 256 ubuntu.iso
# Linux
sha256sum ubuntu.iso
把输出和官方下载页面上的值进行比较,字母的大小写无关紧要。在 Python 中,hashlib 可以做同样的检查,它分块读取文件,所以即使是 6 GB 的文件也不必一次装进内存:
a948904f2f0f479b8f8197694b30184b0d2ed1c1cd2a1ec0fb85d299a192a447
OK
把 hello world 改成 hello World 再运行一次:校验和的每个字符都会改变,最后一行会显示 Checksum mismatch。
什么是校验和错误?
校验和错误表示检查没有通过:根据你手上的数据计算出的值,和数据一起存储或发送的值不一致。要么是数据变了,要么是存储的校验和本身损坏了。具体的提示信息和修复方法取决于错误出现的位置。
开机时出现 CMOS 或 BIOS 校验和错误
电脑的固件(BIOS 或 UEFI)把启动顺序、时钟等设置保存在一小块内存里,电脑断电时靠一颗纽扣电池(通常是 CR2032)维持供电。这些设置的校验和就存放在它们旁边。每次开机时,固件都会重新计算校验和,如果两个值不同,就会显示 CMOS Checksum Error - Defaults Loaded 之类的提示,并恢复出厂设置。
最常见的原因是电池电量不足或已经耗尽,尤其是当时钟也一起被重置时。保存设置时突然断电,或者用跳线清除 CMOS,也会产生同样的效果。修复方法如下:
- 进入设置界面(通常在电脑启动时按 Delete 或 F2),设置日期、时间以及你修改过的其他设置,然后保存并退出(通常按 F10)。如果提示没有再出现,那只是一次偶发事件。
- 如果每次冷启动后都会出现,就关机,拔掉电源,更换 CR2032 电池。
- 如果提示指向固件本身,比如
BIOS ROM checksum error或Main BIOS checksum error,说明固件映像已损坏。带有备份 BIOS 芯片的主板会自动恢复;其他主板则要使用主板自带的 BIOS 恢复功能,或者从厂商官网下载固件重新刷写,刷写过程中千万不能断电。
下载后校验和不匹配
你的文件的 SHA-256 和下载页面上的不一致。可能是文件不完整或已损坏(连接中断、磁盘已满),可能是你拿来比较的是另一个文件的校验和(不同版本或不同 CPU 架构),也可能是你比较了两种不同的算法:MD5 值是 32 个十六进制字符,SHA-256 值是 64 个。极少数情况下,文件被人篡改过。
先核对算法和文件名,再从官方网站重新下载文件。如果从官方来源重新下载的副本仍然不匹配,就不要运行它。包管理器会替你做这项检查:当下载的包与固定的哈希值不一致时,pip 会以 THESE PACKAGES DO NOT MATCH THE HASHES 报错并停止。
ZIP、RAR 或 7z 压缩包中的校验和错误
压缩格式会为每个文件的原始内容保存一个 CRC-32。解压时,工具会重新计算它;WinRAR 把不匹配报告为 Checksum error,7-Zip 则报告为 CRC Failed。对于加密的压缩包,密码错误也会产生同样的提示,因为用错误的密码解密只会得到一堆乱码。请重新下载压缩包,确认分卷压缩包的每个部分(.part1.rar、.part2.rar)都齐全且来自同一次上传,然后重新输入密码。WinRAR 的“修复压缩文件”命令对创建时带有恢复记录的压缩包效果最好,“保留损坏的文件”选项则能保住那些已经正确解压的内容。
游戏和网络工具中的校验和错误
游戏会比较自身文件的校验和,所以更新不完整或文件被改动都会导致检查失败。在 Steam 中,“验证游戏文件的完整性”会重新下载每一个校验和不匹配的文件。在 Wireshark 中,你自己电脑发出的数据包上的校验和警告通常不是真正的错误:网卡是在 Wireshark 抓到数据包之后才填入校验和的。
常见误解
- “校验和匹配就证明文件是安全的。” 它只能证明文件与公布的值一致。如果攻击者控制了网站,就能同时修改这两者,所以很多项目还会用密钥对校验和文件进行签名。
- “校验和可以修复损坏的文件。” 它只能发现损坏。修复的办法是获取一份完好的副本。
- “校验和与哈希是两回事。” 校验和描述的是用途;SHA-256 这样的哈希函数是能完成这项工作的工具之一。
下一步学什么
在哈希生成器中计算任意文本的 MD5、SHA-1 和 SHA-256 值。校验和处理的是原始数据,所以字节是什么和比特是什么解释了到底是什么在被累加。数据库会用页校验和来发现磁盘损坏,哈希表可视化则展示了根据数据计算简短值的另一种用途。
常见问题
SHA-256 是校验和吗?
用来验证数据时,它就是。SHA-256 是一种密码学哈希函数,它为文件生成的 64 个字符的值,通常就被称为该文件的 SHA-256 校验和。它比 CRC-32 慢,但还能防范蓄意篡改,因为实际上没有人能构造出另一个 SHA-256 值相同的文件。
校验和错误怎么修复?
要看错误出现在哪里。如果是开机时出现,进入 BIOS 设置,检查日期和各项设置,保存并退出;如果错误再次出现,就更换 CMOS 纽扣电池。如果是下载后或在压缩包中出现,就从官方来源重新下载文件,并确认分卷压缩包的每个部分都齐全、密码也正确。
校验和错误是什么原因造成的?
数据在计算校验和之后、检查校验和之前发生了变化。常见原因有:下载中断、硬盘或 U 盘出现故障、CMOS 电池电量不足、写入设置或固件时突然断电,以及加密压缩包的密码输错。
为什么需要校验和?
存储设备和网络都不是完美的。电气噪声、无线电干扰、闪存老化或硬盘故障都可能让比特翻转,如果不加检查,损坏的数据就会被悄无声息地使用。校验和是一种低成本的方法,能及时发现损坏,以便重新发送数据或拒绝使用它。
如何生成校验和?
sha256sum file,在 macOS 上用 shasum -a 256 file,在 Windows PowerShell 中用 Get-FileHash file。在 Python 中,hashlib.sha256(data).hexdigest() 会给出 SHA-256 校验和,zlib.crc32(data) 则给出 CRC-32。