You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

hashlib.sha256跨系统返回结果不一致,CentOS CI环境异常

哈希计算结果不一致问题排查

我使用以下代码对包含文件名的文件内容进行哈希计算,但出现了异常结果(哈希值已简化便于阅读):

机器哈希值
Windows 10 - 本地1abc
Windows 10 - 本地2abc
Windows 10 - CI - 机器1abc
Windows 10 - CI - 机器2abc
Linux RHEL 7 - 本地abc
Linux RHEL 7 - CIabc
Linux CentOS 7.9 - 本地abc
Linux CentOS 7.9 - CIabc_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)

排查方向

  1. 核对文件名与编码
    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()}")
    

    因为代码先哈希文件名,再哈希文件内容,文件名的任何差异都会导致最终哈希不同。

  2. 验证文件内容一致性
    直接计算文件内容的哈希,排除文件本身差异:

    sha256sum abc/abc.txt
    

    对比CentOS 7.9本地和CI环境的结果。

  3. 检查CI工作目录与路径
    CI环境的工作目录可能和本地不同,导致Path("abc/abc.txt")指向错误文件。在CI脚本中添加:

    pwd
    ls -R
    

    确认当前目录和文件结构。

  4. 排查文件系统配置
    检查CentOS 7.9 CI环境的文件系统是否有特殊挂载选项(如大小写不敏感),执行mount查看挂载参数。


内容的提问来源于stack exchange,提问作者user69453

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 04:10:35