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

notepad.exe SHA256哈希值计算结果不一致,代码是否存在问题?

问题:C#计算SHA256哈希与PowerShell Get-FileHash结果不一致

我尝试计算notepad.exe的SHA256哈希值,使用了以下C#代码:

public string GetSHA256Hash(string path) { 
    string hashdata = null; 
    using (FileStream fs = File.OpenRead(path)) { 
        SHA256CryptoServiceProvider hashprovider = new SHA256CryptoServiceProvider(); 
        hashdata = BitConverter.ToString(hashprovider.ComputeHash(fs)).Replace("-", string.Empty); 
    } 
    return hashdata; 
}

但通过PowerShell的Get-FileHash命令校验时,得到的哈希值不同,已确认文件路径正确,请问上述代码是否存在问题?


回答

你的代码确实有两个容易踩的坑,导致和PowerShell的结果不一致:

  • 大小写差异:BitConverter.ToString()生成的哈希字符串是大写字母,而PowerShell的Get-FileHash默认输出的是小写字母的哈希值。直接对比大小写不同的字符串,自然会被判定为不相等。
  • 过时API隐患:SHA256CryptoServiceProvider是.NET Framework时期的旧API,在.NET Core/.NET 5+中已经被标记为过时,不仅可能有兼容性问题,还存在潜在的性能或安全优化缺失。

修正后的代码可以解决这些问题:

public string GetSHA256Hash(string path) { 
    string hashdata = null; 
    using (FileStream fs = File.OpenRead(path)) { 
        // 使用官方推荐的SHA256.Create()替代过时的哈希提供者
        using (SHA256 hashprovider = SHA256.Create()) {
            byte[] hashBytes = hashprovider.ComputeHash(fs);
            // 转换为小写十六进制字符串,和PowerShell输出格式对齐
            hashdata = BitConverter.ToString(hashBytes).Replace("-", string.Empty).ToLowerInvariant();
        }
    }
    return hashdata; 
}

另外补充一个小提醒:如果文件在你两次读取的间隙被修改(比如系统后台更新替换了notepad.exe),也可能导致哈希不一致,但你已经确认路径正确,所以大概率是大小写的锅——你可以先手动把C#输出的哈希转成小写,再和PowerShell结果对比,验证这个猜想。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:28:56