Эскимосский раствор
Ниже представлен вариант, основанный на решении, предложенном Eskimo из Apple в сообщении Swift Forum с путаницей в API данных UnsafeBytes :
extension String {
func md5() -> String {
let data = Data(utf8)
var hash = [UInt8](repeating: 0, count: Int(CC_MD5_DIGEST_LENGTH))
data.withUnsafeBytes { buffer in
_ = CC_MD5(buffer.baseAddress, CC_LONG(buffer.count), &hash)
}
return hash.map { String(format: "%02hhx", $0) }.joined()
}
}
Обратите внимание, что оно фактически совпадает с решением Мартина Р., но на строку короче (нет return hash
).
Решение с использованием NSData
Это еще более короткое решение, использующее мостовое соединение с NSData.
extension String {
func md5() -> String {
let data = Data(utf8) as NSData
var hash = [UInt8](repeating: 0, count: Int(CC_MD5_DIGEST_LENGTH))
CC_MD5(data.bytes, CC_LONG(data.length), &hash)
return hash.map { String(format: "%02hhx", $0) }.joined()
}
}