如何从SWIFT中的字符串获取MD5哈希并生成桥头

时间:2015-08-12 11:45:18

标签: xcode swift hash md5

我甚至不指望这个问题,但它出现了。我尝试在swift中从字符串中获取md5哈希值。我在SO上搜索它,并假设我需要像这样导入库:

#import <CommonCrypto/CommonCrypto.h>

首先编译器说'#'不行。然后我删除了编译器说'&lt;'不行。 我试图找出并找到建议添加名为“CommonCrypto”的文件夹并创建一个名为“module.map”的文件。我无法理解如何使用此扩展名创建文件。好的,我创建了swift文件并替换了它的扩展名。然后在那里写代码:

module CommonCrypto [system] {
    header "/usr/include/CommonCrypto/CommonCrypto.h"
    export *
}

再次不行 然后在推荐中将新模块添加到Swift编译器下的导入路径 - 项目设置中的搜索路径$ {SRCROOT} / CommonCrypto)。

再次不行。

我不相信它很难做到这一点。我想我误解了一些步骤或事情。如果你知道一步一步的答案,请帮助))

2 个答案:

答案 0 :(得分:7)

您需要添加桥接标头并向其添加#import <CommonCrypto/CommonCrypto.h>语句。

添加桥接标头的最简单方法是将Objective-C文件添加到项目中,您将需要添加桥接标头,回复是。之后,您可以删除已添加的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)")

输出:

  

摘要: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
}

答案 1 :(得分:0)

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