c++怎么在不加载整个大文件的情况下获取其SHA256校验值【进阶】

张开发
2026/4/17 12:09:39 15 分钟阅读

分享文章

c++怎么在不加载整个大文件的情况下获取其SHA256校验值【进阶】
应使用std::ifstream二进制分块读取大文件并流式计算SHA256缓冲区设64KB–1MB配合OpenSSL的EVP_MD_CTX RAII管理、正确初始化/清理、gcount()校验读取字节数输出32字节哈希为小写十六进制字符串。用 std::ifstream 分块读取避免内存爆炸大文件比如几个 GB 的镜像或视频直接 read() 到内存算 SHA256不是 OOM 就是卡死。核心思路是流式读取 增量哈希更新每次只拿几 KB 或 MB 进缓冲区。C 标准库不带 SHA256得靠 OpenSSLEVP_DigestUpdate或 libsodium 等第三方但读取逻辑自己控制。关键点缓冲区大小别盲目设大——64KB 到 1MB 是较稳区间太小如 1KB系统调用开销高太大如 100MB反而可能触发 swap 或被 OS 杀掉。std::ifstream 必须用 std::ios::binary 模式打开否则 Windows 下遇到 会错位用 file.gcount() 检查每次 read() 实际读了多少字节文件末尾往往不满缓冲区不能直接用 sizeof(buf)别用 file.eof() 当循环条件——它只在尝试读失败后才置位容易多算一次OpenSSL 的 EVP_MD_CTX 必须正确初始化和清理很多人只记得 EVP_DigestInit却漏掉 EVP_DigestFinal_ex 后的 EVP_MD_CTX_free导致内存泄漏更隐蔽的是若中途出错比如磁盘 I/O 失败没调 EVP_MD_CTX_free 就 returnctx 对象就永远卡在堆上。推荐封装成 RAII 类型或者至少确保每个分支都调用 EVP_MD_CTX_free。另外EVP_sha256() 返回的是 const 指针别试图 free 它。立即学习“C免费学习笔记深入” Cleanup.pictures 智能移除图片中的物体、文本、污迹、人物或任何不想要的东西

更多文章