首先需要引入用的的Cocoa類CommonCrypto永票,由于CommonCrypto沒有兼容 Swift,需要將以下導(dǎo)入到項(xiàng)目的Bridging-Header.h
文件中:
#import <CommonCrypto/CommonCrypto.h>
由于移動(dòng)設(shè)備的內(nèi)存有限,以下代碼實(shí)現(xiàn)是將文件分塊讀出并且計(jì)算md5值的方法琳拭,兼容Swift 3.0:
func fileMD5(_ path: String) -> String? {
let handle = FileHandle(forReadingAtPath: path)
if handle == nil {
return nil
}
let ctx = UnsafeMutablePointer<CC_MD5_CTX>.allocate(capacity: MemoryLayout<CC_MD5_CTX>.size)
CC_MD5_Init(ctx)
var done = false
while !done {
let fileData = handle?.readData(ofLength: 256)
fileData?.withUnsafeBytes {(bytes: UnsafePointer<CChar>)->Void in
//Use `bytes` inside this closure
//...
CC_MD5_Update(ctx, bytes, CC_LONG(fileData!.count))
}
if fileData?.count == 0 {
done = true
}
}
//unsigned char digest[CC_MD5_DIGEST_LENGTH];
let digestLen = Int(CC_MD5_DIGEST_LENGTH)
let digest = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: digestLen)
CC_MD5_Final(digest, ctx);
var hash = ""
for i in 0..<digestLen {
hash += String(format: "%02x", (digest[i]))
}
digest.deinitialize()
ctx.deinitialize()
return hash;
}