Qt如何验证两个文件是否相同?

2017-10-11 22:06:39  阅读 282 次 评论 3 条

    现在常用MD5算法来验证文件是否被修改。它的原理是两个完全一样的文件通过MD5计算后得到的值是一样的,然而如果文件被篡改过,即使只改动一点通过MD5计算的值都会不一样。

    MD5是一种哈希算法,所以有可能出现不同文件计算出一样的哈希值的情况,但这样的概率极低。


    Qt提供了一个类QCryptographicHash,它提供了好几中哈希算法,其中包括就包括MD5。具体的如下:

image.png

    

    这个类的用法非常简单,两步就搞定了。

    第一步添加数据, 使用addData(); 该函数有三个重载函数。

    第二步获取结果, 使用result(); 返回一个QByteArray。

    

    另外该类还提供了一个静态函数 : QByteArray hash(const QByteArray& data, Algorithm method) 。

    

    例1:验证文本的哈希值

    QString str1("abc");
    QString str2("def");
    QString str3("abcdef");
    QString str4("abc");
    qDebug()<<"str1 md5"<<QCryptographicHash::hash(str1.toLocal8Bit(),QCryptographicHash::Md5).toHex();
    qDebug()<<"str2 md5"<<QCryptographicHash::hash(str2.toLocal8Bit(),QCryptographicHash::Md5).toHex();
    qDebug()<<"str3 md5"<<QCryptographicHash::hash(str3.toLocal8Bit(),QCryptographicHash::Md5).toHex();
    qDebug()<<"str4 md5"<<QCryptographicHash::hash(str4.toLocal8Bit(),QCryptographicHash::Md5).toHex();

    输出结果:

    str1 md5 "900150983cd24fb0d6963f7d28e17f72"

    str2 md5 "4ed9407630eb1000c0f6b63842defa7d"

    str3 md5 "e80b5017098950fc58aad83c8c14978e"

    str4 md5 "900150983cd24fb0d6963f7d28e17f72"

    可以看出str1 和 str4得到的结果是一样的。

    

    例2:验证文件的哈希值

    QCryptographicHash hashTest(QCryptographicHash::Md5);

    QFile f1("f:/01.jpg");
    f1.open(QFile::ReadOnly);
    hashTest.addData(&f1);  //添加数据
    qDebug()<<"f1 md5"<<hashTest.result().toHex(); //获得结果并转换为16进制输出

    QFile f2("f:/02.jpg");
    f2.open(QFile::ReadOnly);
    hashTest.reset();  //重置
    hashTest.addData(&f2);
    qDebug()<<"f2 md5"<<hashTest.result().toHex();

    QFile f3("f:/03.png");
    f3.open(QFile::ReadOnly);
    hashTest.reset();
    hashTest.addData(&f3);
    qDebug()<<"f3 md5"<<hashTest.result().toHex();

    输出结果:

    f1 md5 "c72a3f76574f9f5a56dffc298b70bb75"

    f2 md5 "c72a3f76574f9f5a56dffc298b70bb75"

    f3 md5 "bc21c6b934dd573922e4a8e566d8b0c2"

    例子中准备了3个文件01.jpg、02.jpg和03.png。 其中02.jpg是复制01.jpg而来,所以这两个不同名字文件内容应该是一样的。从结果看出确实如此。例子除了addData和result以外还用到了reset,意思就是清空原来添加的数据否则计算出的结果将会是多个文件一起的哈希值。


    前面一直在说MD5,实际上这里提供的其他算法也是可以用来判断文件是否一致的,只不过有的计算效率高,有的重复的概率小(专业点叫哈希碰撞)。具体用哪种算法更好,有兴趣的可以深入去了解。

    


本文地址:http://fearlazy.com/index.php/post/33.html
版权声明:本文为原创文章,版权归 fearlazy 所有,欢迎分享本文,转载请保留出处!

发表评论


表情

评论列表

  1. stlcours
    stlcours  @回复

    请问计算文件的MD5的速度怎么样?2G的文件需要多久,10G的文件需要多久??

  2. stlcours
    stlcours  @回复

    请问计算文件的MD5的速度怎么样?2G的文件需要多久,10G的文件需要多久??