Swift 获取文件md5的方法

首先需要引入用的的Cocoa类CommonCrypto,由于CommonCrypto没有兼容 Swift,需要将以下导入到项目的Bridging-Header.h文件中:

#import <CommonCrypto/CommonCrypto.h>

由于移动设备的内存有限,以下代码实现是将文件分块读出并且计算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;

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 初冬有了些许凉意。树的叶子已经大部分变了颜色,鲜嫩的绿色已成七彩。 北风呜呜的嚎叫着。树头的枝条被风吹拂的,没有一...
    馨思遇阅读 424评论 10 3
  • 由三月份开始的跑步,到现在为止已经持续4个月之久,可以说,这是我人生以来坚持的时间最久的跑步记录。 为什么要跑步?...
    Jack_lpz阅读 123评论 0 0
  • 阳光很暖 天空是我中意的几何形状 那时候 无定河很远 柯家沟的溪水潺潺 彳亍而行的螃蟹随手可得 那时候 刨出...
    索佐刈夕阅读 447评论 0 4
  • 2017.1.2 阴 周一 愿感恩的时光,升华自己的生命。 1、感恩亲爱的生活,谢谢你的厚爱。今天是新年的第二...
    感恩日记微幸福阅读 271评论 0 0
  • 现在的微信小程序已经不像刚出来那么火热,还记得微信小程序出来不久,我就被领导火急火燎的要求去注册账号,生怕一耽搁这...
    醉了初柚阅读 351评论 0 0