Swift等同于Python的 - hash.digest()。encode('base64')。strip()?

时间:2016-07-08 21:35:28

标签: python ios swift base64 md5

基本上我正在尝试将我的Python代码转换为Swift,并且似乎找不到这行代码的等效/替代(md5 Hash Digest to base64):

return hash.digest().encode('base64').strip()

来源:https://stackoverflow.com/a/32041572/3697446

它返回一个24个字符的字符串,这正是我的使用所需要的。我尝试将它用于base64但是创建了一个很长的字符串(我猜是因为它是base64编码的hexdigest而不是digest?):

func toBase64(url: String) -> String{
    let data = url.dataUsingEncoding(NSUTF8StringEncoding)
    return data!.base64EncodedStringWithOptions(NSDataBase64EncodingOptions(rawValue: 0))
}

这是我的md5设置(使用CommonCrypto / CommonCrypto.h的桥接头):

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
}

任何帮助都很丰富!

1 个答案:

答案 0 :(得分:2)

正如您所言,您的md5(string:)相当于hexdigest,而不是digest。 md5摘要的结果是一个字节序列,你最好在Swift的NSData中保存它。

定义这个:

func md5Data(string string: String) -> NSData {
    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)
    }

    let digestData = NSData(bytes: digest, length: Int(CC_MD5_DIGEST_LENGTH))

    return digestData
}

你可以这样写:

let result = md5Data(string: "test").base64EncodedStringWithOptions([])
print(result) //->"CY9rzUYh03PK3k6DJie09g=="