如何使用Qt获取文件的SHA-1/MD5校验和?

29

在Qt中有没有一种方法可以获取磁盘上文件的MD5或SHA-1的校验和/哈希值?

例如,我有文件路径,可能需要验证该文件的内容是否与某个哈希值匹配。


参见我对一个更一般的问题的回答,其中使用Qt计算文件的SHA1哈希值。 - maxschlepzig
2个回答

54

使用QFile打开文件,然后调用readAll()将其内容读入QByteArray中。然后将其用于QCryptographicHash::hash(const QByteArray& data, Algorithm method)的调用。

在Qt5中,您可以使用addData()

// Returns empty QByteArray() on failure.
QByteArray fileChecksum(const QString &fileName, 
                        QCryptographicHash::Algorithm hashAlgorithm)
{
    QFile f(fileName);
    if (f.open(QFile::ReadOnly)) {
        QCryptographicHash hash(hashAlgorithm);
        if (hash.addData(&f)) {
            return hash.result();
        }
    }
    return QByteArray();
}

18
readAll() 一次性将所有内容读入内存,对于大文件不是一个好主意。我更愿意使用 addData(&file)。 - Frank Osterfeld
2
@FrankOsterfeld 我同意,我简化了一下以便让观点更清晰 - 这是原帖作者的责任,确保它不会导致系统崩溃。 - cmannett85
在Qt 4.8中,您还可以使用addData()函数。 http://doc.qt.io/qt-4.8/qcryptographichash.html#addData - tropikan4
@tropikan4 但是它不接受 QIODevice,你必须在 Qt 4.8 中读取文件的所有内容,并将其传递进去。 - phyatt

4
如果您正在使用Qt4,可以尝试这个。
QByteArray fileChecksum(const QString &fileName, QCryptographicHash::Algorithm hashAlgorithm)
{
    QFile sourceFile(fileName);
    qint64 fileSize = sourceFile.size();
    const qint64 bufferSize = 10240;

    if (sourceFile.open(QIODevice::ReadOnly))
    {
        char buffer[bufferSize];
        int bytesRead;
        int readSize = qMin(fileSize, bufferSize);

        QCryptographicHash hash(hashAlgorithm);
        while (readSize > 0 && (bytesRead = sourceFile.read(buffer, readSize)) > 0) 
        {
            fileSize -= bytesRead;
            hash.addData(buffer, bytesRead);
            readSize = qMin(fileSize, bufferSize);
        }

        sourceFile.close();
        return QString(hash.result().toHex());
    }
    return QString();
}

因为:

bool QCryptographicHash::addData(QIODevice *device)

从打开的QIODevice设备中读取数据,直到读取完毕并进行哈希处理。如果读取成功,则返回true。

该函数在Qt 5.0中引入。

参考资料:https://www.qtcentre.org/threads/47635-Calculate-MD5-sum-of-a-big-file


太棒了!只需要将返回类型从QByteArray改为QString进行微小的修改即可。 - Hareen Laks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接