ios – Swift计算大文件的MD5校验和

ios – Swift计算大文件的MD5校验和,第1张

概述我正在为大型视频文件创建MD5校验和.我目前正在使用代码: extension NSData {func MD5() -> NSString { let digestLength = Int(CC_MD5_DIGEST_LENGTH) let md5Buffer = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: di 我正在为大型视频文件创建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校验和
例如在 Is there a MD5 library that doesn’t require the whole input at the same time?.

以下是使用Swift的可能实现:

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,
return digest
,numericCast(data.count)) } return true // Continue } else { return false // End of file } }) { } // Compute the MD5 digest: var digest = Data(count: Int(CC_MD5_DIGEST_LENGTH)) digest.withUnsafeMutableBytes { _ = CC_MD5_Final(
let hexDigest = digest.map { String(format: "%02hhx",) }.joined()return hexDigest
,&context) } return digest } catch { print("Cannot open file:",error.localizedDescription) return nil }}

需要自动释放池来释放返回的内存
file.readData(),没有它的整个(可能是巨大的)文件
将被加载到内存中.感谢Abhi Beckert注意到这一点
并提供实施.

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

通过

总结

以上是内存溢出为你收集整理的ios – Swift计算大文件的MD5校验和全部内容,希望文章能够帮你解决ios – Swift计算大文件的MD5校验和所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1101327.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存