测试我的MD5 Swift 3代码

时间:2017-06-16 08:39:32

标签: swift3 md5 commoncrypto

我有一些代码可以从文件数据生成MD5字符串:

extension Data {

func hexString() -> String {
    let string = self.map{ String($0, radix:16) }.joined()

    // "45769ca7ec1ac00cec11df87df982b7d"
    return string
}

func MD5() -> Data {
    var result = Data(count: Int(CC_MD5_DIGEST_LENGTH))
    _ = result.withUnsafeMutableBytes {resultPtr in
        self.withUnsafeBytes {(bytes: UnsafePointer<UInt8>) in
            CC_MD5(bytes, CC_LONG(count), resultPtr)
        }
    }
    return result
}
}

extension String {
    func hexString() -> String {
        return self.data(using: .utf8)!.hexString()
    }

    func MD5() -> String {
        return self.data(using: .utf8)!.MD5().hexString()
    }
}

我不确定这是否有效,因为它可能只是我从Vimeo获得的MD5字符串是错误的。

首先,Swift 3代码是否可以生成MD5?用法:

let fileHandle = try? FileHandle(forReadingFrom: getFileUrl(forFileId: id)!)
let fileData = fileHandle?.availableData
if let md5 = fileData?.MD5().hexString() { ... }

其次,是否有一个可用于上传文件并获取其MD5字符串的Web工具?

更新:我在在线MD5工具中测试了我的文件,得到以下哈希:F0750875A790471702E9D2D34433729A 但我的代码产生了这个:f075875a79047172e9d2d34433729a

看起来如此接近!它必须是我的扩展中的东西。在Swift 3中有更好的MD5解决方案吗?

1 个答案:

答案 0 :(得分:0)

确定。我找到了一个很好的解决方案:

extension Data {

var md5String:String {

    var digest = [UInt8](repeating: 0, count: Int(CC_MD5_DIGEST_LENGTH))

    var digestHex = ""
    self.withUnsafeBytes { (bytes: UnsafePointer<CChar>) -> Void in

        CC_MD5(bytes, CC_LONG(self.count), &digest)
        for index in 0..<Int(CC_MD5_DIGEST_LENGTH) {
            digestHex += String(format: "%02x", digest[index])
        }
    }
    return digestHex
  }

}

这是数据扩展上的计算变量。我测试了这个,它产生了正确的MD5哈希字符串。您也可以在String扩展上使用它,如下所示:

extension String {

func MD5() -> String {
    return self.data(using: .utf8)!.md5String
}
}