【问题标题】:How to get MD5 hash from string in SWIFT and make bridge-header如何从 SWIFT 中的字符串中获取 MD5 哈希并制作桥头
【发布时间】:2015-08-12 11:45:18
【问题描述】:

我什至没想到会出现这个问题,但它会出现。我尝试快速从字符串中获取 md5 哈希。我在 SO 上搜索并假设我需要像这样导入库:

#import <CommonCrypto/CommonCrypto.h>

首先编译器说'#'不行。然后我删除了,编译器说'

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

又一次不行 然后建议将新模块添加到 Swift Compiler 下的 Import Paths – 项目设置中的 Search Paths ${SRCROOT}/CommonCrypto)。

又不行了。

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

【问题讨论】:

  • 你把它放在你的桥接头里了吗?
  • 我更喜欢这种原生实现:github.com/krzyzanowskim/CryptoSwift
  • @Logan 请注意,CryptoSwift 版本比 Common Crypto 版本慢 500 倍以上。
  • @zaph 正如我所说,你错了 500 号,然后你开始做一些其他的事情来证明我的东西,但你不必真的,你已经知道我的反应了。从那时起,我希望你的贡献。有一种方法可以提高性能,但需要动手做实际工作才能实现。我敢打赌,这比这里的讨论更好地消磨时间。问候。

标签: xcode swift hash md5


【解决方案1】:

您需要添加一个桥接头并向其添加#import &lt;CommonCrypto/CommonCrypto.h&gt; 语句。

添加桥接头最简单的方法是在项目中添加一个 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
}

【讨论】:

    【解决方案2】:

    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

    【讨论】:

      猜你喜欢
      • 2013-08-28
      • 1970-01-01
      • 2012-07-12
      • 2011-03-02
      • 1970-01-01
      • 1970-01-01
      • 2011-11-29
      • 1970-01-01
      • 2012-10-10
      相关资源
      最近更新 更多