如何将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 }
这里只有两个注释:
使用encryption对于实现这一点太多了。
接受的答案是完美的! 不过,我只是想分享一个使用Swift 2.2的Swift 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来做到这一点。
-
如果您尚未安装Carthage,请安装Carthage
-
将Crypto安装到您的项目中
-
执行“卡车更新”
-
如果你从命令行运行,那么在swift文件中添加框架
#!/usr/bin/env xcrun swift -F Carthage/Build/Mac
-
添加导入Crypto到你的swift文件。
-
那么它只是工作!
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