MD5工具开发
MD5消息摘要算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值(hash value),用于 确保信息传输完整一致。MD5由美国密码学家罗纳德·李维斯特(Ronald LinnRivest)设计,于1992年公开,用以取代MD4算法。
MD5应用编辑
一致性验证
数字签名
安全访问认证
创建一个Qt Widget Application
选择添加一个C++ Class
UI页面布局:
md5check.h
#include <QObject>
#include<QThread>
#include <QFileInfo>
#include <QFileDialog>
#include<qDebug>
#include<QFile>
#include <QCryptographicHash>
#include<QTime>
class Md5Check : public QObject
{
Q_OBJECT
public:
explicit Md5Check(QObject *parent = nullptr);
signals:
void sendMd5CheckSignal(const QByteArray &);//反馈到md5值得界面
void sendProgressBarSignal(int,int);//反馈到进度条页面,以生成进度条
//已处理的数据量,待处理的数据量
public slots:
void getMd5CheckSumSlot(const QString &filePath);
};
#endif // MD5CHECK_H
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include"md5check.h"
#include <QClipboard>
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
signals:
void checkMd5SumSignal(const QString &filePath);
private slots:
void on_toolButtonOpenFile_clicked();
void recvMd5CheckSumSlot(const QByteArray &);
void recvProgressBarSlot(int,int);
void on_pushButtonClose_clicked();
void on_pushButtonCopySum_clicked();
private:
Ui::Widget *ui;
Md5Check mMd5CheckSum;
QThread md5Thread;
};
#endif // WIDGET_H
widget.cpp
#include "ui_widget.h"
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
mMd5CheckSum.moveToThread(&md5Thread);//从object移动到一个thread
md5Thread.start();
qDebug()<<"Widget::Widget"<<QThread::currentThreadId();
connect(&mMd5CheckSum,SIGNAL(sendMd5CheckSignal(QByteArray)),this,SLOT(recvMd5CheckSumSlot(QByteArray)));
connect(this,SIGNAL(checkMd5SumSignal(QString)),&mMd5CheckSum,SLOT(getMd5CheckSumSlot(QString)));
connect(&mMd5CheckSum,SIGNAL(sendProgressBarSignal(int,int)),this,SLOT(recvProgressBarSlot(int,int)));
}
Widget::~Widget()
{
md5Thread.exit();//线程退出
qDebug()<<QTime::currentTime();
md5Thread.wait(10*1000);//10秒超时(阻塞时间最大为10秒)
qDebug()<<QTime::currentTime();//确定wait()时间
delete ui;
}
void Widget::on_toolButtonOpenFile_clicked()
{
QFileInfo md5FileInfo;
QString md5FileName=QFileDialog::getOpenFileName(this,
QString::fromLocal8Bit("打开需要的MD5SUM文件"));//弹出一个文件对话框
qDebug()<<"md5FleNmae path:"<<md5FileName;//输出选择文件的地址
md5FileInfo=QFileInfo(md5FileName);//得到文键
ui->textBrowser->clear();
if(md5FileInfo.exists())
{
ui->lineEdit->setText(md5FileInfo.fileName());//在lineEdit中输出文件名
emit checkMd5SumSignal(md5FileName);//把文件的地址作为信号发射出去
}
}
void Widget::recvMd5CheckSumSlot(const QByteArray &baResult)
{
ui->textBrowser->setText(baResult);
}
void Widget::recvProgressBarSlot(int current, int total)
{
ui->progressBar->setMaximum(total);
ui->progressBar->setValue(current);
//顺序不能反
}
void Widget::on_pushButtonClose_clicked()
{
this->close();
}
void Widget::on_pushButtonCopySum_clicked()
{
QString source=ui->textBrowser->toPlainText();//得到textBrowser上面的内容
qDebug()<<source;
QClipboard *clipboard = QApplication::clipboard();//获
取剪切板上的指针
//QString originalText = clipboard->text(); //获取剪贴板上文本信息
clipboard->setText(source);//设置剪切板的内容
}
md5check.cpp
#include "md5check.h"
Md5Check::Md5Check(QObject *parent) : QObject(parent)
{
}
void Md5Check::getMd5CheckSumSlot(const QString &filePath)
{
QFile file(filePath);
QByteArray md5Result;
QFileInfo md5FileInfo;
md5FileInfo=QFileInfo(filePath);
int totalSize=md5FileInfo.size()/(1024*1024);//选中文件的大小(这里把字节转化为M)
if(md5FileInfo.size()%(1024*1024)>0)
{
totalSize=totalSize+1;//为了文件的最后不足1M直接加1
}
int currentSize=0;
qDebug()<<"Md5Check::getMd5CheckSumSlot "<<QThread::currentThreadId();
if(file.open(QIODevice::ReadOnly))
{
QCryptographicHash hash(QCryptographicHash::Md5);
while(!file.atEnd())//如果文件读不出,死不退出
{
QByteArray content=file.read(1024*1024);
hash.addData(content);
currentSize++;
emit sendProgressBarSignal(currentSize,totalSize);
}
md5Result=hash.result().toHex();
qDebug()<<md5Result;
emit sendMd5CheckSignal(md5Result);
file.close();
}
else
{
return ;
}
}