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

 SADFGHJKSADFV_565 发布于 2023-01-10 11:52

在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中不起作用.如何处理这个问题.

4 个回答
  • 这就是我提出的.它是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)
        }
     }
    

    2023-01-10 11:53 回答
  • 这是我在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])
        }
    }
    

    2023-01-10 11:54 回答
  • 所以这是解决方案,我知道它将节省您的时间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)
    }
    

    }

    如何将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()

    2023-01-10 11:54 回答
  • 作为CryptoSwift项目的一部分,我做了纯粹的Swift实现MD5 .

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

    2023-01-10 11:54 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有