如何在swift语言中使用CC_MD5方法.

Sue*_*uen 45 md5 swift

在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)

  • 在一个框架中没有桥接头,在这种情况下如何处理这个?您正在添加哪个库/框架"Link Binary With Libraries"? (4认同)

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)

  • NSData实际上在几个私有系统框架中获得了名为hexString的私有方法.如果您将方法命名为hexString,它最终会咬你.检查此网址:https://github.com/nst/iOS-Runtime-Headers/search?utf8=%E2%9C%93&q=hexString (2认同)

Mar*_*cin 10

作为CryptoSwift项目的一部分,我做了纯粹的Swift实现MD5 .

我可以在这里复制代码,但它使用属于此项目的扩展,因此对于复制和粘贴用法可能没用.但是你可以看看并使用它.


Bas*_*ano 6

所以这是解决方案,我知道它将节省您的时间100%

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()