使用 CryptoKit 的大文件的 SHA-256

SHA-256 of large file using CryptoKit

有谁知道无需将整个文件加载到内存中即可计算文件的 de SHA-256 哈希值的方法吗?

我最好使用苹果的 CryptoKit 库

创建哈希器:

let hasher = SHA256()

对于您读取的每个块(以您想要读取的任何方式或大小),更新哈希器:

hasher.update(data: blockOfData)

(或者如果你有 UnsafeRawBufferPointer,你可以通过)

完成后,完成它:

let hash = haser.finalize()

您可以使用 FileHandle 以块的形式读取数据,并将它们传递到哈希器中:

import CryptoKit

func getSHA256(forFile url: URL) throws -> SHA256.Digest {
    let handle = try FileHandle(forReadingFrom: url)
    var hasher = SHA256()
    while autoreleasepool(invoking: {
        let nextChunk = handle.readData(ofLength: SHA256.blockByteCount)
        guard !nextChunk.isEmpty else { return false }
        hasher.update(data: nextChunk)
        return true
    }) { }
    let digest = hasher.finalize()
    return digest

    // Here's how to convert to string form
    //return digest.map { String(format: "%02hhx", [=10=]) }.joined()
}