md5 souboru v Pythonu 3 a Qt frameworku 4.7 (C++)

Při svém hledání kódu pro md5 hash souboru v Pythonu jsem narazil na několik, které měly problémy s velkými soubory a/nebo byly pomalé. Následující „zhašoval“ obraz DVD 4.5GB za neuvěřitelných 57 sekund oproti Total Commanderu, který to zvládl za 66 sekund. Paradoxně nejpomalejší byl kód v C++ knihovny Qt – 75 sekund. Oba kódy používají 1MB buffer – ostatní velikosti od 512kB do 5MB se liší o (zanedbatelnou) +1 sekundu.

import hashlib

def md5(fileName):
    md5 = hashlib.md5()
    fd = open(fileName,"rb")
    while True:
        buffer = fd.read(1024)
        md5.update(buffer)
        if len(buffer) < 1024:
            break
    fd.close()
    return md5.hexdigest()

A tady je kód pro Qt framework.

#include <QtGui>
#include <QCryptographicHash>

QString md5(QString fileName)
{
    QString md5Hash = "";
    QCryptographicHash *hash = new QCryptographicHash(QCryptographicHash::Md5);
    QFile *file = new QFile(fileName);
    if (!file->open(QIODevice::ReadOnly | QIODevice::Unbuffered))
    {
        return (md5Hash); //if opening fails, returns empty string
    }
    QByteArray buffer;
    qint64 bufSize = Q_INT64_C(1024*1024); // changing can increase performace
    while(!(buffer = file->read(bufSize)).isEmpty())
    {
        hash->addData(buffer);
    }
    md5Hash = hash->result().toHex();

    file->close();

    delete hash;
    hash = 0;
    delete file;
    file = 0;

    return (md5Hash);
}

Kód v C++ byl inspirován kódem zveřejněným na abclinuxu.cz - můj původní neměl buffer.

Ať vám slouží :-)

P.S. Nemýlím-li se je (v C++) zavolání delete na hash a file nezbytné - jinak by program leakoval. Pokud se mýlím, opravte mne, prosím, v diskusi. Pokud máte tip, jak kód(y) zrychlit, piště prosím tamtéž.

You can skip to the end and leave a response. Pinging is currently not allowed.

Napište prosím komentář

Zaškrtněte v případě, že chcete emailem dostávat upozornění na nové komentáře.