CRC-32 是 32 位循环冗余校验,用来发现意外的数据损坏,不是密码学哈希,也不能防故意篡改。下面重点说明从概念到动手。
CRC32开发入门
CRC 把数据看作二进制多项式,按约定多项式做除法,余数即为校验值。实现上多用 256 项表加速。Python zlib.crc32 与以太网/PNG 使用相同参数:初值 0xFFFFFFFF,末尾再异或 0xFFFFFFFF,多项式反转形式为 0xEDB88320。
- 用 Python zlib.crc32 或 PHP hash("crc32b") 计算并格式化为 8 位十六进制
- 与文件格式要求的变体对照,ZIP/PNG 通常就是这一种
- 不要用 CRC 代替 SHA-256 做安全校验
示例
输入:你好,世界
计算结果:acf5da54(十进制 2901793364)
说明:CRC-32(与 PHP hash("crc32b")、ZIP/以太网常用的反转多项式 0xEDB88320 一致)。
注意事项
- PHP hash("crc32") 和 hash("crc32b") 结果不同,对接时要写明
- 不要拿 CRC 当密码哈希
- 初始值和是否取反会彻底改变结果
- 把有符号 32 位整数(有的语言 CRC 返回负数)格式化成十六进制时要先转成无符号
常见报错
- 与对方结果不同:变体(crc32 / crc32b)或端序不一致
- Java 的 int 打印成负数:先与 0xFFFFFFFFL 再格式化
- 误用 CRC 做安全校验
本站的哈希全家桶工具可以直接处理,计算在浏览器本地完成,适合快速核对结果。
常见问题
【CRC-32 安全吗?】只适合发现意外损坏,不能防故意伪造。
【为什么和网上工具不一致?】多半不是同一种 CRC-32 变体,或字符串带了换行。
【Python 里为什么有时是负数?】zlib.crc32 返回有符号区间,用 & 0xFFFFFFFF 再格式化即可。
文中示例可以在本站对应工具中验证;处理密钥、证书等敏感数据时,请注意保护隐私。
标签: 数码开发
版权声明:除非特别标注,否则均为本站原创文章,转载时请以链接形式注明文章出处。