当前位置: 首页 > news >正文

QT---》文件MD5码的获取与验证

目录

一、概要

二、开发环境

1. 开发环境

2. 核心解析

三、实现步骤

1、一次性获取(小文件)

2、分段获取(大文件)

3、适配多种不同的哈希值处理结果

4、以上方法调用demo

        四、MD5准确值验证

        五、参考文献


一、概要

  1. MD5 的作用:简介 MD5 算法(消息摘要算法)的特点(固定 128 位哈希值、不可逆性),常用于文件完整性校验(如下载文件校验)、数据加密、文件去重等场景。
  2. Qt 中的优势:Qt 框架提供了QCryptographicHash类,无需依赖第三方库,可跨平台(Windows/Linux/macOS)实现文件 MD5 计算,简化开发流程。
  3. 本文目标:教你如何在 Qt 中通过QFile结合QCryptographicHash实现文件 MD5 的计算,包括大文件处理方案,并提供可直接复用的代码。

二、开发环境

1. 开发环境

  • Qt 版本:建议 Qt5.6 及以上(QCryptographicHash在该版本后接口更稳定)
  • 编译器:MinGW/GCC/MSVC 均可
  • 依赖模块:核心模块QtCore(无需 GUI 模块,控制台程序也可使用)

2. 核心解析

  • QFile:用于文件读取(支持分块读取,适合大文件)。
  • QCryptographicHash:Qt 提供的加密哈希类,支持 MD5、SHA1、SHA256 等算法,本文重点使用其addData()(添加数据)和result()(获取哈希结果)方法。
  • QByteArray:用于存储文件读取的二进制数据和最终的 MD5 哈希值(需转为十六进制字符串展示)。

三、实现步骤

1、一次性获取(小文件)

//头文件
#include <QDebug>
#include <QByteArray>
#include <QString>
#include <QIODevice>
#include <QFile>
#include <QFileDialog>
#include <QCryptographicHash>
//获取文件MD5或者Sha1码等  参数 = 文件路径
void MainWindow::readFileMd5(QString filePath)
{QFile file(filePath);if(file.open(QIODevice::ReadOnly)){qDebug() << "打开文件成功";//这里 QCryptographicHash::Md5 是个枚举类型,可以说改成你需要的比如Sha1、Sha3QByteArray ba = QCryptographicHash::hash(file.readAll(), QCryptographicHash::Md5);qDebug() << ba.toHex(); //打印MD5码,或改成你的返回file.close();}else{qDebug() << "打开文件失败";}
}

2、分段获取(大文件)


//分段读取生成MD5码- 参数=文件路径
void MainWindow::readBigFileMd5(QString filePath)
{QFile file(filePath);QCryptographicHash hash(QCryptographicHash::Md5);if(file.open(QIODevice::ReadOnly))//打开文件{while(!file.atEnd()){QByteArray content = file.read(1024 * 1024 * 100);hash.addData(content);}QByteArray md5 = hash.result();//打印MD5码qDebug() << "MD5:" << md5.toHex();file.close();}else{qDebug() << "打开文件失败";}
}

3、适配多种不同的哈希值处理结果

/*** @brief 分段段读取文件并计算哈希值(支持多种算法)* @param filePath 文件路径* @param algorithm 哈希算法* @return 成功返回哈希值的十六进制字符串,失败返回空字符串*/
QString MainWindow::calculateFileHash(const QString& filePath, QCryptographicHash::Algorithm algorithm)
{// 检查文件是否存在if (!QFile::exists(filePath)) {qWarning() << "文件不存在:" << filePath;return QString();}QFile file(filePath);// 尝试打开文件(只读模式)if (!file.open(QIODevice::ReadOnly)) {qWarning() << QString("文件打开失败: %1,原因: %2").arg(filePath).arg(file.errorString());return QString();}// 创建始化哈希计算对象QCryptographicHash hash(algorithm);const qint64 bufferSize = 65536; // 64KB缓冲区char buffer[bufferSize];qint64 totalBytesRead = 0;// 分段读取文件并更新新哈希while (!file.atEnd()) {// 读取数据,返回实际读取的字节数qint64 bytesRead = file.read(buffer, bufferSize);// 检查是否读取错误if (bytesRead == -1) {qWarning() << QString("文件读取失败: %1,原因: %2").arg(filePath).arg(file.errorString());file.close();return QString();}// 添加数据到哈希计算器hash.addData(buffer, bytesRead);totalBytesRead += bytesRead;}// 关闭文件file.close();qDebug() << QString("文件处理完成,总读取字节数: %1 字节").arg(totalBytesRead);// 返回十六进制哈希值return hash.result().toHex();
}

4、以上方法调用demo

 
//弹出文件选择框
QString fileName = QFileDialog::getOpenFileName(this,QStringLiteral("文件对话框!"),"F:",QStringLiteral("所有文件(*.*)"));//调用第一种-如果方法需要返回,请自行修改方法返回值
readFileMd5(fileName);//调用第二种-如果方法需要返回,请自行修改方法返回值
readBigFileMd5(fileName);
// 在MainWindow类的某个方法中调用
void MainWindow::onCalculateHashClicked()
{// 示例文件路径(可替换为实际文件路径或通过文件选择对话框获取)QString filePath = "/path/to/your/file.txt";// 计算MD5哈希值QString md5Hash = calculateFileHash(filePath, QCryptographicHash::Md5);if (!md5Hash.isEmpty()) {qDebug() << "MD5哈希值:" << md5Hash;// 可在此处将结果显示到UI,例如:ui->md5Label->setText(md5Hash);} else {qDebug() << "MD5哈希值计算失败";}// 计算SHA1哈希值QString sha1Hash = calculateFileHash(filePath, QCryptographicHash::Sha1);if (!sha1Hash.isEmpty()) {qDebug() << "SHA1哈希值:" << sha1Hash;// 可在此处将结果显示到UI,例如:ui->sha1Label->setText(sha1Hash);} else {qDebug() << "SHA1哈希值计算失败";}// 计算SHA256哈希值QString sha256Hash = calculateFileHash(filePath, QCryptographicHash::Sha256);if (!sha256Hash.isEmpty()) {qDebug() << "SHA256哈希值:" << sha256Hash;// 可在此处将结果显示到UI,例如:ui->sha256Label->setText(sha256Hash);} else {qDebug() << "SHA256哈希值计算失败";}
}

四、MD5准确值验证

(1)、快捷键“Win+R”-->输入“cmd”;

(2)、输入指令“certutil -hashfile "文件路径” MD5”,回车,对比程序运行和此是否一致;

certutil -hashfile "文件路径" MD5

五、参考文献

参考文献:https://blog.csdn.net/u012402739/article/details/130343018

文献备份:https://blog.csdn.net/arv002/article/details/130135979

http://www.lryc.cn/news/605390.html

相关文章:

  • 结合C++红黑树与AI人工智能的应用
  • Linux启动防火墙提示提示 Active: failed (Result: timeout)
  • 7.pcl滤波(一)
  • IFCVF驱动+vhost-vfio提高虚拟机网络性能
  • 在线免疫浸润分析
  • Kimi-K2技术报告解读:万亿参数大模型,开源模型新SOTA
  • 如何判断一个数据库是不是出问题了?
  • STM32F1 Flash的操作
  • Python Day19 时间模块 和 json模块 及例题分析
  • C语言15-构造数据类型、位运算符、内存管理
  • 2018 年 NOI 最后一题题解
  • yolo8+阿里千问图片理解(华为简易版小艺看世界)
  • CSS 工作原理
  • 卡尔曼滤波通俗入门:预测、测量与最优融合
  • 重生之我在暑假学习微服务第五天《Docker部署项目篇》
  • 【人工智能99问】混合专家模型(MoE)是如何训练的?(18/99)
  • lesson28:Python单例模式全解析:从基础实现到企业级最佳实践
  • QT笔记--》QMenu
  • Java String类练习
  • 编程算法:从理论基石到产业变革的核心驱动力
  • 数字化转型-制造业未来蓝图:“超自动化”工厂
  • HTTPS基本工作过程:基本加密过程
  • List 接口
  • 基于动态权重-二维云模型的川藏铁路桥梁施工风险评估MATLAB代码
  • 人形机器人_双足行走动力学:基于OpenSim平台的股骨模型与建模
  • Python并发与性能革命:自由线程、JIT编译器的深度解析与未来展望
  • pytorch入门2:利用pytorch进行概率预测
  • C++中sizeof运算符全面详解和代码示例
  • sqli-labs:Less-5关卡详细解析
  • MySQL学习---分库和分表