如何将string转换为使用ios swift的MD5哈希

我想转换用户input或假设像“abc”任何string到MD5散列。 我想在ios中迅速做到这一点。 我已经提到了下面的链接,但解决scheme不适合我,或者我很困惑,因为我是新的快速编程正确实施它。 有人可以帮我明确的步骤来实现这一点。 提前致谢!

在Swift框架中导入CommonCrypto

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

http://iosdeveloperzone.com/2014/10/03/using-commoncrypto-in-swift/

要更清楚我想要像在php中所做的那样快速实现这一点。

$str = "Hello"; echo md5($str); 

输出:8b1a9953c4611296a827abf8c47804d7

有两个步骤:
1.从string创buildmd5数据
2.将md5数据隐藏到hexstring

Swift 2.0

 func md5(string string: String) -> String { var digest = [UInt8](count: Int(CC_MD5_DIGEST_LENGTH), repeatedValue: 0) if let data = string.dataUsingEncoding(NSUTF8StringEncoding) { CC_MD5(data.bytes, CC_LONG(data.length), &digest) } var digestHex = "" for index in 0..<Int(CC_MD5_DIGEST_LENGTH) { digestHex += String(format: "%02x", digest[index]) } return digestHex } //Test: let digest = md5(string:"Hello") print("digest: \(digest)") 

输出:

摘要:8b1a9953c4611296a827abf8c47804d7

Swift 3.0:

 func MD5(string: String) -> Data { let messageData = string.data(using:.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 } //Test: let md5Data = MD5(string:"Hello") let md5Hex = md5Data.map { String(format: "%02hhx", $0) }.joined() print("md5Hex: \(md5Hex)") let md5Base64 = md5Data.base64EncodedString() print("md5Base64: \(md5Base64)") 

输出:

md5Hex:8b1a9953c4611296a827abf8c47804d7
md5Base64:ixqZU8RhEpaoJ6v4xHgE1w ==

笔记:
必须将#import <CommonCrypto/CommonCrypto.h>添加到Bridging-Header文件中

有关如何创build桥接头,请参阅此答案 。

通常MD5不应该用于新的工作,SHA256是目前的最佳做法。

来自不推荐的文档部分的示例:

MD2,MD4,MD5,SHA1,SHA224,SHA256,SHA384,SHA512(Swift 3+)

这些函数将散列string或数据input与八个encryption哈希algorithm之一。

name参数将散列函数名称指定为String
支持的function有MD2,MD4,MD5,SHA1,SHA224,SHA256,SHA384和SHA512 a这个例子需要Common Crypto
有必要有一个桥头到项目:
#import <CommonCrypto/CommonCrypto.h>
将Security.framework添加到项目。



这个函数需要一个散列名和string被散列并返回一个Data:

名称:散列函数的名称作为string  
string:要被散列的string  
返回:散列结果作为数据  
 func hash(name:String, string:String) -> Data? { let data = string.data(using:.utf8)! return hash(name:name, data:data) } 

例子:

 let clearString = "clearData0123456" let clearData = clearString.data(using:.utf8)! print("clearString: \(clearString)") print("clearData: \(clearData as NSData)") let hashSHA256 = hash(name:"SHA256", string:clearString) print("hashSHA256: \(hashSHA256! as NSData)") let hashMD5 = hash(name:"MD5", data:clearData) print("hashMD5: \(hashMD5! as NSData)") 

输出:

 clearString: clearData0123456 clearData: <636c6561 72446174 61303132 33343536> hashSHA256: <aabc766b 6b357564 e41f4f91 2d494bcc bfa16924 b574abbd ba9e3e9d a0c8920a> hashMD5: <4df665f7 b94aea69 695b0e7b baf9e9d6> 

SWIFT 3版本的md5 function

 func md5(_ string: String) -> String { let context = UnsafeMutablePointer<CC_MD5_CTX>.allocate(capacity: 1) var digest = Array<UInt8>(repeating:0, count:Int(CC_MD5_DIGEST_LENGTH)) CC_MD5_Init(context) CC_MD5_Update(context, string, CC_LONG(string.lengthOfBytes(using: String.Encoding.utf8))) CC_MD5_Final(&digest, context) context.deallocate(capacity: 1) var hexString = "" for byte in digest { hexString += String(format:"%02x", byte) } return hexString } 

来自http://iosdeveloperzone.com的原始链接;

这里只有两个注释:

使用encryption对于实现这一点太多了。

接受的答案是完美的! 不过,我只是想分享一个使用Swift 2.2Swift ier代码方法。

请记住,您还需要#import <CommonCrypto/CommonCrypto.h>Bridging-Header文件中#import <CommonCrypto/CommonCrypto.h>

 struct MD5Digester { // return MD5 digest of string provided static func digest(string: String) -> String? { guard let data = string.dataUsingEncoding(NSUTF8StringEncoding) else { return nil } var digest = [UInt8](count: Int(CC_MD5_DIGEST_LENGTH), repeatedValue: 0) CC_MD5(data.bytes, CC_LONG(data.length), &digest) return (0..<Int(CC_MD5_DIGEST_LENGTH)).reduce("") { $0 + String(format: "%02x", digest[$1]) } } } 

我用迦太基和Cyrpto来做到这一点。

  1. 如果您尚未安装Carthage,请安装Carthage

  2. 将Crypto安装到您的项目中

  3. 执行“卡车更新”

  4. 如果你从命令行运行,那么在swift文件中添加框架

     #!/usr/bin/env xcrun swift -F Carthage/Build/Mac 
  5. 添加导入Crypto到你的swift文件。

  6. 那么它只是工作!

     print( "convert this".MD5 ) 

这是一个基于zaph答案的扩展

 extension String{ var MD5:String { get{ let messageData = self.data(using:.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.map { String(format: "%02hhx", $0) }.joined() } } } 

完全兼容swift 3.0。你仍然需要在你的Bridging-Header文件中#import <CommonCrypto/CommonCrypto.h>

我刚刚发布了一个纯粹的Swift实现,不依赖于CommonCrypto或其他任何东西。

这是一个单独的文件,您可以将其放入项目中,或者使用包含Xcode项目和框架目标。

这也很简单:

 let input = "The quick brown fox jumps over the lazy dog" let digest = input.utf8.md5 print("md5: \(digest)") 

打印: md5: 9e107d9d372bb6826bd81d3542a419d6