hashlib.sha256跨系统返回结果不一致,CentOS CI环境异常
哈希计算结果不一致问题排查
我使用以下代码对包含文件名的文件内容进行哈希计算,但出现了异常结果(哈希值已简化便于阅读):
| 机器 | 哈希值 |
|---|---|
| Windows 10 - 本地1 | abc |
| Windows 10 - 本地2 | abc |
| Windows 10 - CI - 机器1 | abc |
| Windows 10 - CI - 机器2 | abc |
| Linux RHEL 7 - 本地 | abc |
| Linux RHEL 7 - CI | abc |
| Linux CentOS 7.9 - 本地 | abc |
| Linux CentOS 7.9 - CI | abc_linux_other |
关键现象
- Windows环境下,无论机器、用户、系统补丁版本,结果始终一致;
- RHEL 7环境中,本地、CI机器,甚至切换不同用户通过SSH执行,结果也始终一致;
- 仅CentOS 7.9的CI环境返回异常哈希值;
- 所有机器均使用相同版本的Python,甚至是相同的Python安装包。
我完全不清楚问题的根源,也不知道从何处入手排查。
哈希计算代码
import hashlib from pathlib import Path MAX_READ = 4096 some_file = Path("abc/abc.txt") cs = hashlib.sha256() buffer = some_file.name.encode("utf-8") cs.update(buffer) with open(some_file, "rb") as f: while buffer: buffer = f.read(MAX_READ) cs.update(buffer)
排查方向
核对文件名与编码
Linux区分文件名大小写,CentOS 7.9 CI环境中的文件名可能存在大小写差异、不可见字符(如空格、控制符)。执行以下命令查看文件名的二进制细节:ls -l abc/ hexdump -C <<< "$(basename abc/abc.txt)"同时在Python中输出文件名编码:
from pathlib import Path f = Path("abc/abc.txt") print(f"文件名: {f.name}") print(f"UTF-8编码: {f.name.encode('utf-8')}") print(f"十六进制: {f.name.encode('utf-8').hex()}")因为代码先哈希文件名,再哈希文件内容,文件名的任何差异都会导致最终哈希不同。
验证文件内容一致性
直接计算文件内容的哈希,排除文件本身差异:sha256sum abc/abc.txt对比CentOS 7.9本地和CI环境的结果。
检查CI工作目录与路径
CI环境的工作目录可能和本地不同,导致Path("abc/abc.txt")指向错误文件。在CI脚本中添加:pwd ls -R确认当前目录和文件结构。
排查文件系统配置
检查CentOS 7.9 CI环境的文件系统是否有特殊挂载选项(如大小写不敏感),执行mount查看挂载参数。
内容的提问来源于stack exchange,提问作者user69453
相关产品推荐
相关产品推荐

