在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]
];
Run Code Online (Sandbox Code Playgroud)
但是现在CC_MD5在swift中不起作用.如何处理这个问题.
Jer*_*ner 84
这就是我提出的.它是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)
}
}
Run Code Online (Sandbox Code Playgroud)
jst*_*stn 35
这是我在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])
}
}
Run Code Online (Sandbox Code Playgroud)
Mar*_*cin 10
作为CryptoSwift项目的一部分,我做了纯粹的Swift实现MD5 .
我可以在这里复制代码,但它使用属于此项目的扩展,因此对于复制和粘贴用法可能没用.但是你可以看看并使用它.
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)
}
Run Code Online (Sandbox Code Playgroud)
}
如何将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
}
}
Run Code Online (Sandbox Code Playgroud)
如何使用?
let stringConvertedToMD5 ="foo".toMD5()
| 归档时间: |
|
| 查看次数: |
40556 次 |
| 最近记录: |