讲师中心 微信公众号
AI工具推荐 视频效率加速

C++怎么判断两个文件相同 C++计算文件MD5比对方法【校验】

梦瑶小哥_6995

梦瑶小哥_6995

发布时间:2026-02-01 12:56:40

|

241人浏览过

|

来源于php中文网

原创

正确做法是用std::ifstream二进制模式分块读取(如8192字节),配合OpenSSL的MD5_Init/Update/Final流式计算MD5;需先比对文件大小,再处理异常;输出用sprintf或std::format转32位小写十六进制字符串。

c++怎么判断两个文件相同 c++计算文件md5比对方法【校验】

用 std::ifstream 逐块读取并计算 MD5,别直接 read() 整个文件

内存有限或文件超大时,read() 一次性加载会崩溃或拖慢程序。MD5 是流式哈希算法,必须分块喂给哈希函数。标准库不提供 MD5,得用 OpenSSL(推荐)或轻量实现(如 md5.h 单头文件)。OpenSSL 的 MD5_Update() 就是为这种场景设计的——每次传入一块数据,内部维护状态。

实操建议:

  • 开 std::ifstream 用 std::ios::binary 模式,否则 Windows 下换行符会被误转
  • 缓冲区大小建议设为 8192 或 65536 字节,太小频繁调用系统调用,太大无益(缓存已足够)
  • 读完后检查 ifs.gcount() 是否等于本次 read() 请求字节数,避免末尾截断
  • OpenSSL 初始化需调用 MD5_Init(),结束前必须 MD5_Final(),否则结果无效

OpenSSL 的 MD5() 函数不能直接用于文件,要用 MD5_Update() 流式处理

很多人看到 OpenSSL 头文件里有 MD5(const unsigned char *, size_t, unsigned char *) 就直接传文件路径字符串进去,结果算出来的是路径名的 MD5,不是文件内容。这个函数只做“一次性内存块哈希”,和文件无关。

正确路径是:

立即学习“C++免费学习笔记(深入)”;

  • 声明 MD5_CTX ctx
  • 调用 MD5_Init(&ctx)
  • 循环 read() + MD5_Update(&ctx, buf, n)
  • 最后 MD5_Final(digest, &ctx)

注意:MD5_CTX 不可重用,每次新文件都要重新 Init;多线程下要各自独立实例,不能共享。

windows-shell
windows-shell

Windows 命令行编码与兼容规范。涵盖 GBK/UTF-8 编码、PowerShell/pwsh 互操作、Python/Node.js、Git 配置及代码生成规则。适用于 Windows 10/11 + MSYS2/Git Bash 环境下的所有命令行操作。

下载

比对两个文件 MD5 前,先确认文件大小是否相等

大小不同,MD5 必然不同。这步能秒杀绝大多数不等文件,避免浪费 CPU 算哈希。Windows 用 GetFileSizeEx(),Linux/macOS 用 stat() 或 std::filesystem::file_size()(C++17 起)。

示例逻辑:

if (std::filesystem::file_size(path1) != std::filesystem::file_size(path2)) {
    return false; // 直接返回,不进哈希流程
}

注意:std::filesystem::file_size() 抛异常(如权限不足、路径不存在),务必用 try/catch 包裹;而 stat() 返回 -1 并设 errno,更底层但更可控。

输出 MD5 字符串时,sprintf 或 std::format(C++20)比手写循环更安全

原始 digest[16] 是二进制字节,要转成 32 位小写十六进制字符串。手写 for 循环容易错位、漏补零、大小写混用。用格式化函数最稳:

  • C++20 可用 std::format("{:02x}{:02x}...", digest[0], digest[1], ...)
  • 更通用做法:用 sprintf(buf, "%02x%02x%02x...", digest[0], digest[1], ...)
  • 切忌用 std::hex 直接流输出——没补零,且 <code>char 有符号扩展风险(0xFF 变成 0xFFFFFFFF)

比对时,两个字符串必须全小写、无空格、长度严格 32 位,再用 == 比较。别用 strcmp,除非你确保是 C 风格字符串。

文件是否相同,本质是内容字节一致。MD5 只是高效代理;真正不可绕过的是二进制逐字节比对——当 MD5 碰撞虽概率极低但理论上存在,金融或固件校验场景仍需 fallback 到 memcmp 分块校验。

热门AI工具

更多
DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

咔片AIPPT

一款在线AI演示文稿制作工具,可根据主题和内容需求辅助生成PPT结构与页面,提高演示材料制作效率。

二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

相关专题

更多
format在python中的用法
format在python中的用法

Python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

1789

2023.07.31

python中的format是什么意思
python中的format是什么意思

python中的format是一种字符串格式化方法,用于将变量或值插入到字符串中的占位符位置。通过format方法,我们可以动态地构建字符串,使其包含不同值。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

1211

2024.06.27

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

2298

2023.09.20

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1818

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2864

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6204

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

5989

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

7614

2024.03.22

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

40

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Python uv官方安装与入门文档
Python uv官方安装与入门文档

共0课时 | 0人学习

Buffalo框架快速入门指南
Buffalo框架快速入门指南

共0课时 | 0人学习

Valgrind支持平台说明
Valgrind支持平台说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn