我正在为大型视频文件创建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校验和,因此内存占用量最小?
2 回答
您可以以块的形式计算MD5校验和,如图所示 . 在Is there a MD5 library that doesn't require the whole input at the same time? .
以下是使用Swift的可能实现:
需要自动释放池才能释放
file.readData()
返回的内存,而不会将整个(可能很大的)文件加载到内存中 . 感谢Abhi Beckert注意到并提供了实施 .如果您需要将摘要作为十六进制编码的字符串,则将返回类型更改为
String?
并替换通过
针对SHA256哈希的解决方案(基于Martin R的答案):
使用前面创建的名为
fileURL
的URL
类型的实例: