当我使用Insecure.MD5.hash(data:data(获取数据的MD5结果时,我在iOS 13.0中发现结果不正确,这是我的代码:
if let data = "helloworld".data(using: .utf8) {
let digest = Insecure.MD5.hash(data: data)
for i in digest {
print(i)
}
let result = digest.map { String(format: "%02hhx", $0) }.joined()
print("StringMD5Result--(result)")
}
结果为fc5e038d38a57032085441e7fe7010b000000000,但correctResult应为fc5e38d38a57032085461e7Fe7010b0。
那么,这是苹果在iOS 13.0中的错误吗?
很可能不会,因为我无法重现您的结果。对我来说,这是应该的(我应用了一些风格上的改进(:
import Foundation
import CryptoKit
func md5(string: String) -> String {
let digest = Insecure.MD5.hash(data: Data(string.utf8))
return digest.map {
String(format: "%02hhx", $0)
}.joined()
}
print(md5(string: "helloworld")) // returns fc5e038d38a57032085441e7fe7010b0
我在iOS 13.0上遇到了和你一样的问题,我也认为这是苹果的错误。
我的解决方案
MD5散列函数生成的比特数是固定的,它生成了一个128比特的散列值。由于我们使用十六进制数来表示,而一个十六进制数占用4位,因此最终的MD5值由32个十六进制数来表示。
因此我们可以使用CCD_ 1函数来截取字符串。
替换:
let result = digest.map { String(format: "%02hhx", $0) }.joined()
到
let result = String(digest.map { String(format: "%02hhx", $0) }.joined().prefix(32))