Swift中的UTF16LE(无BOM和0字节结束)的MD5

时间:2018-03-10 21:09:04

标签: ios swift md5

我遇到与此主题完全相同的问题:

MD5 of an UTF16LE (without BOM and 0-Byte End) in C#

但是,我试图在基于Swift 4的iOS应用程序中实现这一点。我尝试了

中讨论的所有选项

How to convert string to MD5 hash using ios swift

以及https://github.com/krzyzanowskim/CryptoSwift

但我无法生成正确的MD5哈希值。我生成了一个输入字符串的字节数组,并删除了字符串末尾的0字节,并使用了上面线程中提到的函数。如果有人可以请我指出正确的方向。 基本上utf8字符串“1234567z-äbc”应该变成“9e224a41eeefa284df7bb0f26c2913e2”

这就是我到目前为止所做的:

$result = $mongo->Book->aggregate([
    [
        "$project" => [
            "title.de" => "$title.de",
            "count" => [
                "$sum" => [
                    "$map" => [
                        "input" => [
                            "$filter" => [
                                "input" => "$volumes",
                                "as" => "vol",
                                "cond" => "$$vol.bought"
                            ]
                        ],
                        "as" => "el",
                        "in" => "$$el.price"
                    ]
                ]
            ]
        ]
    ],
    [
        '$sort' => [
            'count' => -1
        ]
    ]
])

1 个答案:

答案 0 :(得分:1)

let str = "1234567z" + "-" + "äbc"
let data = str.data(using: .utf16LittleEndian)!

已经提供了您想要计算的UTF16LE数据 MD5哈希,不需要过滤掉0字节或任何其他操作。

而是从How to convert string to MD5 hash using ios swift修改函数以获取Data参数 而不是String

func MD5(messageData: Data) -> Data {
    var digestData = Data(count: Int(CC_MD5_DIGEST_LENGTH))
    _ = digestData.withUnsafeMutableBytes {digestBytes in
        messageData.withUnsafeBytes {messageBytes in
            CC_MD5(messageBytes, CC_LONG(messageData.count), digestBytes)
        }
    }
    return digestData
}

以便您可以使用已转换的数据调用它:

let str = "1234567z" + "-" + "äbc"
let data = str.data(using: .utf16LittleEndian)!

let md5Data = MD5(messageData: data)
let md5Hex =  md5Data.map { String(format: "%02hhx", $0) }.joined()

print("md5Hex: \(md5Hex)")
// 9e224a41eeefa284df7bb0f26c2913e2