.net 6+ 中 system.io.hashing 命名空间不存在,官方哈希 api 位于 system.security.cryptography;应使用 sha256.create() 配合 cryptostream 流式计算,避免内存溢出与句柄泄漏。

System.IO.Hashing 在 .NET 6+ 中不可用?先确认你真在用对的 SDK
它压根没进 System.IO.Hashing 命名空间——这个命名空间是“计划中但从未发布”的幻影。.NET 6+ 官方哈希 API 其实藏在 System.Security.Cryptography 下,且默认不带 HashAlgorithmName.SHA256 这类便捷枚举的文件级封装。
- 你看到的
System.IO.Hashing可能来自第三方 NuGet 包(如Microsoft.Experimental.IO.Hashing),但它已废弃、不维护、不兼容 .NET 7+,强装会导致运行时TypeLoadException - .NET 6+ 内置唯一可靠路径是
System.Security.Cryptography.HashAlgorithm+ 手动流读取 - 别查 MSDN 上标着 “.NET 6+” 的
System.IO.Hashing文档——那是旧版文档未清理干净,实际类型不存在
计算大文件 SHA256:用 CryptoStream 避免内存爆炸
直接 File.ReadAllBytes() 算哈希?1GB 文件就 OOM。正确姿势是边读边喂给哈希器,靠 CryptoStream 管道衔接。
- 必须用
using包裹FileStream和HashAlgorithm,否则句柄泄漏、哈希值错乱 -
HashAlgorithm.Create("SHA256")已过时,改用SHA256.Create()(返回实例,非静态工厂) - 别设
bufferSize小于 4096——小缓冲会显著拖慢吞吐,尤其 SSD;8192 是安全起点
using var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read, 8192, FileOptions.SequentialScan); using var sha256 = SHA256.Create(); using var cs = new CryptoStream(fs, sha256, CryptoStreamMode.Read); fs.CopyTo(new MemoryStream()); // 触发完整读取 byte[] hash = sha256.Hash;
想一行搞定?用 HashAlgorithm.ComputeHash(Stream) 但注意陷阱
看起来简洁:sha256.ComputeHash(fs) —— 实际它会把流 Position 拉到末尾,后续再读就空了。
- 如果之后还要读文件内容(比如解析 JSON 或解压),必须加
fs.Position = 0回溯,否则逻辑崩坏 - 该方法内部仍会一次性加载整个流到内存(哪怕你传的是 FileStream),对超大文件无优化
- 它不支持
FileOptions.SequentialScan,无法提示 OS 做预读,I/O 效率低于手动CopyTo流式处理
跨平台一致性:Linux/macOS 下注意 FileOptions 兼容性
FileOptions.SequentialScan 在 Windows 上有效,在 Linux/macOS 上被忽略——但不会报错,容易误以为优化生效。
- 真要提升大文件性能,Linux 应优先用
MemoryMappedFile(需 .NET 7+)或Span<byte></byte>分块读取 - macOS 对
FileStream缓冲行为更敏感,bufferSize=8192比4096稳定,65536反而可能因 page fault 升高延迟 - 哈希值本身跨平台一致(算法标准),但 I/O 路径差异会让同文件耗时浮动 20%–50%,别拿 Windows 时间去卡 CI 的 Linux 超时阈值
Position 或漏一个 using,就是半夜告警。










