我遇到与此主题完全相同的问题:
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
]
]
])
答案 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