参考
环境
环境 | 版本 |
---|---|
windows | 10 |
QT | 6.2.4 |
Qt Creator | 8.0.1 (Community) |
qmake |
代码段
第一种
一次性读取文件内容获取文件 md5 (大文件可能内存不够)
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QString>
#include <QFile>
#include <QIODevice>
#include <QCryptographicHash>
#include <QByteArray>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
QString filePath = "C:/20220920163330.png";
QFile file(filePath);
if(file.open(QIODevice::ReadOnly)){
qDebug() << "打开文件成功";
QByteArray ba = QCryptographicHash::hash(file.readAll(), QCryptographicHash::Md5);
qDebug() << ba.toHex();
file.close();
}else{
qDebug() << "打开文件失败";
}
}
第二种
分段读取文件内容获取文件 md5 (比较好的方法)
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QString>
#include <QFile>
#include <QIODevice>
#include <QCryptographicHash>
#include <QByteArray>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_clicked()
{
QFile file("C:/xxx.png");
QCryptographicHash hash(QCryptographicHash::Md5);
//
if(file.open(QIODevice::ReadOnly)){
qDebug() << "打开文件成功";
while(!file.atEnd()){
QByteArray content = file.read(100* 1024 * 1024);
hash.addData(content);
}
QByteArray md5 = hash.result();
//
qDebug() << "MD5:" << md5 << " hex:" << md5.toHex();
//
file.close();
}else{
qDebug() << "打开文件失败";
}
}
第三种
第三种是采样获取
- 首先判断文件大小是否相同
- 文件大小相同则分段读取,判断是否不通,如果读取段相同则继续读取