当前位置: 首页 > 面试题库 >

快速计算大文件的MD5校验和

冯德宇
2023-03-14
问题内容

我正在为大型视频文件创建MD5校验和。我当前正在使用代码:

extension NSData {
func MD5() -> NSString {
    let digestLength = Int(CC_MD5_DIGEST_LENGTH)
    let md5Buffer = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: digestLength)

    CC_MD5(bytes, CC_LONG(length), md5Buffer)
    let output = NSMutableString(capacity: Int(CC_MD5_DIGEST_LENGTH * 2))
    for i in 0..<digestLength {
        output.appendFormat("%02x", md5Buffer[i])
    }

    return NSString(format: output)
    }
}

但这会创建一个内存缓冲区,并且对于大型视频文件而言并不理想。Swift中是否有一种方法可以计算读取文件流的MD5校验和,从而使内存占用量最小?


问题答案:

您可以分块计算MD5校验和,例如在?中有没有一个MD5库不需要同时输入全部内容?。

这是使用Swift的可能实现(现已针对Swift 5更新)

import CommonCrypto

func md5File(url: URL) -> Data? {

    let bufferSize = 1024 * 1024

    do {
        // Open file for reading:
        let file = try FileHandle(forReadingFrom: url)
        defer {
            file.closeFile()
        }

        // Create and initialize MD5 context:
        var context = CC_MD5_CTX()
        CC_MD5_Init(&context)

        // Read up to `bufferSize` bytes, until EOF is reached, and update MD5 context:
        while autoreleasepool(invoking: {
            let data = file.readData(ofLength: bufferSize)
            if data.count > 0 {
                data.withUnsafeBytes {
                    _ = CC_MD5_Update(&context, $0.baseAddress, numericCast(data.count))
                }
                return true // Continue
            } else {
                return false // End of file
            }
        }) { }

        // Compute the MD5 digest:
        var digest: [UInt8] = Array(repeating: 0, count: Int(CC_MD5_DIGEST_LENGTH))
        _ = CC_MD5_Final(&digest, &context)

        return Data(digest)

    } catch {
        print("Cannot open file:", error.localizedDescription)
        return nil
    }
}

需要自动释放池来释放所返回的内存 file.readData(),否则,整个文件(可能很大)将被加载到内存中。感谢Abhi
Beckert注意到这一点并提供了实现。

如果您需要摘要作为十六进制编码的字符串,则将返回类型更改为String?并替换

return digest

通过

let hexDigest = digest.map { String(format: "%02hhx", $0) }.joined()
return hexDigest


 类似资料:
  • 我正在使用iTextSharp从PDF文件中读取文本。然而,有些时候我不能提取文本,因为PDF文件只包含图像。我每天下载同样的PDF文件,我想看看PDF是否被修改过。如果无法获得文本和修改日期,那么MD5校验和是判断文件是否已更改的最可靠方法吗? 如果是的话,一些代码示例将会很感激,因为我对密码学没有太多的经验。

  • 接口说明 校验要上传的文件的每一个文件分片 API地址 POST /api/upload/1.0.0/md5 是否需要登录 否 请求字段说明 参数 类型 请求类型 是否必须 说明 fileName string form 是 数据标识 menuId string form 是 权限id,值为31 响应字段说明 参数 类型 说明 guid String 文件id md5_arr String 逗号分

  • 我在执行一个为给定文件计算MD5和SHA1校验和的方法时遇到一个问题。我的方法如下所示: SHA1: MD5: 在执行其中一个方法时,我得到一个IOException:进程无法访问文件“(PATHTOFILE),因为另一个进程正在使用它。 这是一个持续存在的问题,我无法计算PC上任何文件的校验和。我以本地管理员身份登录,而VS以管理员身份打开。这对于我尝试过的任何目录都是持久的,例如:C:\tem

  • 问题内容: 我正在寻找使用Java获取文件的MD5校验和。我真的很惊讶,但是我找不到任何能显示如何获取文件的MD5校验和的东西。 怎么做? 问题答案: 有一个输入流装饰器,因此你可以像往常一样在使用输入流的同时计算摘要,而不必对数据进行额外的传递。

  • 我正在努力将现有的应用程序与File Picker集成。在我们现有的设置中,我们依赖md5校验和来确保数据完整性。据我所知,文件选择器在响应REST API的上传时没有提供任何md5(也没有使用JavaScript客户端)。 我们使用 S3 进行存储,据我所知,您可以在存储文件时向 S3 提供 md5 校验和,以便在数据似乎错误时 Amazon 可以验证并拒绝存储请求。 为了确保数据不会在网络中损

  • plz请参阅本页以查看Boost::CRC示例代码:http://www.boost.org/doc/libs/1_37_0/libs/crc/crc_example.cpp