Java — QT — QFile — медленное чтение из файла

Я хочу вычислить MD5 хеш файла.

Если я использую fast_md5 с родной lib http://twmacinta.com/myjava/fast_md5.php, затем Java читает файл с жесткого диска со скоростью 90 МБ / с … 120 МБ / с и время вычисления составляет 70 секунд.

Если я использую QT

  QCryptographicHash hash(QCryptographicHash::Md5);

QFile in("C:/file.mkv");

QFileInfo fileInfo("C:/file.mkv");
qint64 imageSize = fileInfo.size();

const int bufferSize = 1000000;

char buf[bufferSize+5];
int bytesRead;

if (in.open(QIODevice::ReadOnly)) {

while ( (bytesRead = in.read(buf, bufferSize)) > 0) {
//            imageSize -= bytesRead;
//            hash.addData(buf, bytesRead);

}

}
else {
qDebug() << "Failed to open device!";
}

in.close();
qDebug() << hash.result().toHex();

Затем моя программа читает файл с жесткого диска со скоростью 20 … 78 МБ / с и время вычисления составляет 210 секунд.

Можно ли ускорить обработку MD5 Calc в QT? Может понадобится увеличить буфер с 1000000 до большего значения?

0

Решение

Лучшее решение

/*max bytes to read at once*/
static const qint64 CHUNK_SIZE = 1024;

/*init hash*/
QCryptographicHash hash(Sha1);

/*open file*/
QFile file("foo.bar");
if (!file.open(QIODevice::ReadOnly))
return;

/*process file contents*/
QByteArray temp = file.read(CHUNK_SIZE);
while(!temp.isEmpty())
{
hash.addData(temp);
temp = file.read(CHUNK_SIZE);
}

/*finalize*/
const QByteArray res = hash.result();
qDebug("Hash is: %s", res.toHex());

Это решение обеспечивает мне лучшую скорость чтения (около 100-120 МБ / с) и лучшее время вычисления — 51 … 75 секунд.

От https://qt-project.org/forums/viewthread/41886

0

Другие решения


По вопросам рекламы [email protected]