如何从 SWIFT 中的字符串中获取 MD5 哈希并制作桥头
How to get MD5 hash from string in SWIFT and make bridge-header
我什至没想到这个问题,但它出现了。我尝试从 swift 中的字符串获取 md5 散列。我在 SO 上搜索并假设我需要像这样导入库:
#import <CommonCrypto/CommonCrypto.h>
首先编译器说'#'不对。然后我删除了,编译器说“<”不行。
我试图弄清楚这一点,并找到了添加名为 "CommonCrypto" 的文件夹并创建名为 "module.map" 的文件的建议。我无法理解如何使用此扩展名创建文件。好的,我创建 swift 文件并替换其扩展名。然后在那里写代码:
module CommonCrypto [system] {
header "/usr/include/CommonCrypto/CommonCrypto.h"
export *
}
又不行了
然后在建议中将新模块添加到 Swift Compiler – Search Paths 下的 Import Paths in your project settings ${SRCROOT}/CommonCrypto).
又不行了。
我简直不敢相信这很难做到。我想我误解了一些步骤或其他东西。如果你知道一步一步的答案请帮忙))
您需要添加桥接 header 并向其添加 #import <CommonCrypto/CommonCrypto.h>
语句。
添加桥接 header 的最简单方法是将 Objective-C 文件添加到项目中,您将被告知要添加桥接 header,回复是.之后你可以删除添加的Objective-C文件文件
示例代码:
func md5(#string: String) -> NSData {
var digest = NSMutableData(length: Int(CC_MD5_DIGEST_LENGTH))!
if let data :NSData = string.dataUsingEncoding(NSUTF8StringEncoding) {
CC_MD5(data.bytes, CC_LONG(data.length),
UnsafeMutablePointer<UInt8>(digest.mutableBytes))
}
return digest
}
//Test:
let digest = md5(string:"Here is the test string")
println("digest: \(digest)")
输出:
digest: 8f833933 03a151ea 33bf6e3e bbc28594
这里有一个更 Swift 2.0 版本返回数组 UInt8
:
func md5(string string: String) -> [UInt8] {
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)
}
return digest
}
Swift 4.1 的解决方案:
import CommonCrypto
extension Data
{
func md5() -> Data
{
var digest = Data(count: Int(CC_MD5_DIGEST_LENGTH))
self.withUnsafeBytes { (bytes : UnsafePointer<UInt8>) -> Void in
digest.withUnsafeMutableBytes { (mutableBytes : UnsafeMutablePointer<UInt8>) -> Void in
CC_MD5(bytes, CC_LONG(self.count), mutableBytes)
}
}
return digest
}
}
CommonCrypto
部分参见 Importing CommonCrypto in a Swift framework。
我什至没想到这个问题,但它出现了。我尝试从 swift 中的字符串获取 md5 散列。我在 SO 上搜索并假设我需要像这样导入库:
#import <CommonCrypto/CommonCrypto.h>
首先编译器说'#'不对。然后我删除了,编译器说“<”不行。 我试图弄清楚这一点,并找到了添加名为 "CommonCrypto" 的文件夹并创建名为 "module.map" 的文件的建议。我无法理解如何使用此扩展名创建文件。好的,我创建 swift 文件并替换其扩展名。然后在那里写代码:
module CommonCrypto [system] {
header "/usr/include/CommonCrypto/CommonCrypto.h"
export *
}
又不行了 然后在建议中将新模块添加到 Swift Compiler – Search Paths 下的 Import Paths in your project settings ${SRCROOT}/CommonCrypto).
又不行了。
我简直不敢相信这很难做到。我想我误解了一些步骤或其他东西。如果你知道一步一步的答案请帮忙))
您需要添加桥接 header 并向其添加 #import <CommonCrypto/CommonCrypto.h>
语句。
添加桥接 header 的最简单方法是将 Objective-C 文件添加到项目中,您将被告知要添加桥接 header,回复是.之后你可以删除添加的Objective-C文件文件
示例代码:
func md5(#string: String) -> NSData {
var digest = NSMutableData(length: Int(CC_MD5_DIGEST_LENGTH))!
if let data :NSData = string.dataUsingEncoding(NSUTF8StringEncoding) {
CC_MD5(data.bytes, CC_LONG(data.length),
UnsafeMutablePointer<UInt8>(digest.mutableBytes))
}
return digest
}
//Test:
let digest = md5(string:"Here is the test string")
println("digest: \(digest)")
输出:
digest: 8f833933 03a151ea 33bf6e3e bbc28594
这里有一个更 Swift 2.0 版本返回数组 UInt8
:
func md5(string string: String) -> [UInt8] {
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)
}
return digest
}
Swift 4.1 的解决方案:
import CommonCrypto
extension Data
{
func md5() -> Data
{
var digest = Data(count: Int(CC_MD5_DIGEST_LENGTH))
self.withUnsafeBytes { (bytes : UnsafePointer<UInt8>) -> Void in
digest.withUnsafeMutableBytes { (mutableBytes : UnsafeMutablePointer<UInt8>) -> Void in
CC_MD5(bytes, CC_LONG(self.count), mutableBytes)
}
}
return digest
}
}
CommonCrypto
部分参见 Importing CommonCrypto in a Swift framework。