【问题标题】:How to get the SHA-1/MD5 checksum of a file with Qt?如何使用 Qt 获取文件的 SHA-1/MD5 校验和?
【发布时间】:2013-04-29 07:15:07
【问题描述】:

有没有办法在 Qt 中获取磁盘上文件的 MD5 或 SHA-1 校验和/哈希?

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

【问题讨论】:

标签: c++ qt hash checksum


【解决方案1】:

使用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();
}

【讨论】:

  • readAll() 一次将所有内容读入内存,对于大文件来说不是一个好主意。我宁愿使用 addData(&file)。
  • @FrankOsterfeld 我同意,我正在简化以说明问题 - 确保系统不会崩溃是 OP 的责任。
  • 在 Qt 4.8 中你也可以使用 addData() doc.qt.io/qt-4.8/qcryptographichash.html#addData
  • @tropikan4 但不接受 QIODevice,您必须在 Qt 4.8 中读取文件的所有内容,然后将其传入。
【解决方案2】:

如果你使用的是 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。
猜你喜欢
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-23
  • 1970-01-01
相关资源
最近更新 更多