标签:
概念解释:Message Digest(摘要) Algorithm (算法) : 信息摘要算法第五版
就是把任意长度的字节串编程一个一定长的十六进制数字串
特点
1、压缩性:任意长度的数据,算出的MD5值长度都是固定的。
2、容易计算:从原数据计算出MD5值很容易。
3、抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
4、强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值,最终返回一个128位的1或者0
这个算法是不可逆的。
这个算法可以帮你查看文件是否被修改
struct MD5Utility { static func getMD5FromString(string: String) -> NSMutableString { let original = string.cStringUsingEncoding(NSUTF8StringEncoding) let digest = UnsafeMutablePointer<UInt8>.alloc(16) let length = UInt32(strlen(original!)) CC_MD5(original!, length, digest) return getMD5Str(digest) } static func getMD5FromData(data: NSData) ->NSMutableString { let original = data.bytes let ori = unsafeBitCast(original, UnsafePointer<Int8>.self) let MD5Length = Int(CC_MD5_DIGEST_LENGTH) let digest = UnsafeMutablePointer<UInt8>.alloc(MD5Length) let length = UInt32(strlen(ori)) CC_MD5(original, length, digest) return getMD5Str(digest) } static func getMD5FromFilePath(path: String) -> NSMutableString { let handel = NSFileHandle(forReadingAtPath: path) if handel == nil { print("failed") return NSMutableString(string: "file is not opened") } // 先声明一个context上下文 var context = CC_MD5_CTX() // 初始化一个上下文 CC_MD5_Init(&context) var done = true while done { var data = handel?.readDataOfLength(1024) // 对上下文进行更新 CC_MD5_Update(&context, &data, UInt32((data?.length)!)) if data?.length == 0 { done = false } } let digest = UnsafeMutablePointer<UInt8>.alloc(16) // 最终确定上下文 CC_MD5_Final(digest, &context) return getMD5Str(digest) } private static func getMD5Str(digest: UnsafeMutablePointer<UInt8>) -> NSMutableString { let md5String = NSMutableString(capacity: 16 * 2) for index in 0..<16 { md5String.appendFormat("%02x", digest[index]) } digest.destroy() return md5String } }
标签:
原文地址:http://www.cnblogs.com/kuaixian/p/5557280.html