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éž.