QT---》文件MD5码的获取与验证
目录
一、概要
二、开发环境
1. 开发环境
2. 核心解析
三、实现步骤
1、一次性获取(小文件)
2、分段获取(大文件)
3、适配多种不同的哈希值处理结果
4、以上方法调用demo
四、MD5准确值验证
五、参考文献
一、概要
- MD5 的作用:简介 MD5 算法(消息摘要算法)的特点(固定 128 位哈希值、不可逆性),常用于文件完整性校验(如下载文件校验)、数据加密、文件去重等场景。
- Qt 中的优势:Qt 框架提供了
QCryptographicHash
类,无需依赖第三方库,可跨平台(Windows/Linux/macOS)实现文件 MD5 计算,简化开发流程。- 本文目标:教你如何在 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