在objective-c中,我们可以通过以下代码用md5加密字符串
const char *cStr = [someString UTF8String]; unsigned char result[16]; CC_MD5( cStr, strlen(cStr), result ); md5String = [NSString stringWithFormat: @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", result[0], result[1], result[2], result[3], result[4], result[5], result[6], result[7], result[8], result[9], result[10], result[11], result[12], result[13], result[14], result[15] ];
但是现在CC_MD5在swift中不起作用.如何处理这个问题.
这就是我提出的.它是String的扩展.不要忘记添加#import <CommonCrypto/CommonCrypto.h>
Xcode创建的ObjC-Swift桥接头.
extension String { var md5: String! { let str = self.cStringUsingEncoding(NSUTF8StringEncoding) let strLen = CC_LONG(self.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)) let digestLen = Int(CC_MD5_DIGEST_LENGTH) let result = UnsafeMutablePointer<CUnsignedChar>.alloc(digestLen) CC_MD5(str!, strLen, result) let hash = NSMutableString() for i in 0..<digestLen { hash.appendFormat("%02x", result[i]) } result.dealloc(digestLen) return String(format: hash as String) } }
这是我在Swift 3.0中的版本,我相信它比其他答案更安全,更快.
需要一个桥接头#import <CommonCrypto/CommonCrypto.h>
.
func MD5(_ string: String) -> String? { let length = Int(CC_MD5_DIGEST_LENGTH) var digest = [UInt8](repeating: 0, count: length) if let d = string.data(using: String.Encoding.utf8) { _ = d.withUnsafeBytes { (body: UnsafePointer<UInt8>) in CC_MD5(body, CC_LONG(d.count), &digest) } } return (0..<length).reduce("") { $0 + String(format: "%02x", digest[$1]) } }
BridgingHeader - >用于将Objective-c代码暴露给Swift项目
CommonCrypto - >是使用md5哈希所需的文件
由于Common Crypto是Objective-c文件,因此您需要使用BridgingHeader来使用散列所需的方法
(例如)
extension String { func md5() -> String! { let str = self.cStringUsingEncoding(NSUTF8StringEncoding) let strLen = CUnsignedInt(self.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)) let digestLen = Int(CC_MD5_DIGEST_LENGTH) let result = UnsafeMutablePointer<CUnsignedChar>.alloc(digestLen) CC_MD5(str!, strLen, result) var hash = NSMutableString() for i in 0..<digestLen { hash.appendFormat("%02x", result[i]) } result.destroy() return String(format: hash as String) }
}
如何将Common Crypto添加到Swift项目中?
此链接将教您如何(逐步).
我建议使用Bridging Header
*************更新了Swift 3****************
extension String { func toMD5() -> String { if let messageData = self.data(using:String.Encoding.utf8) { var digestData = Data(count: Int(CC_MD5_DIGEST_LENGTH)) _ = digestData.withUnsafeMutableBytes {digestBytes in messageData.withUnsafeBytes {messageBytes in CC_MD5(messageBytes, CC_LONG((messageData.count)), digestBytes) } } return digestData.hexString() } return self } } extension Data { func hexString() -> String { let string = self.map{ String($0, radix:16) }.joined() return string } }
如何使用?
let stringConvertedToMD5 ="foo".toMD5()
作为CryptoSwift项目的一部分,我做了纯粹的Swift实现MD5 .
我可以在这里复制代码,但它使用属于此项目的扩展,因此对于复制和粘贴用法可能没用.但是你可以看看并使用它.