En Swift 4 podríamos usar
var md5: String? { guard let data = self.data(using: .utf8) else { return nil } let hash = data.withUnsafeBytes { (bytes: UnsafePointer<Data>) -> [UInt8] in var hash: [UInt8] = [UInt8](repeating: 0, count: Int(CC_MD5_DIGEST_LENGTH)) CC_MD5(bytes, CC_LONG(data.count), &hash) return hash } return hash.map { String(format: "%02x", $0) }.joined() } Pero en Swift 5 withUnsafeBytes usa UnsafeRawBufferPointer en lugar de UnsafePointer . ¿Cómo cambiar la función md5?
Versión Swift 5: use UnsafeRawBufferPointer como tipo de argumento de cierre y bytes.baseAddress para pasar la dirección a la función Common Crypto:
import Foundation import CommonCrypto extension String { var md5: String { let data = Data(self.utf8) let hash = data.withUnsafeBytes { (bytes: UnsafeRawBufferPointer) -> [UInt8] in var hash = [UInt8](repeating: 0, count: Int(CC_MD5_DIGEST_LENGTH)) CC_MD5(bytes.baseAddress, CC_LONG(data.count), &hash) return hash } return hash.map { String(format: "%02x", $0) }.joined() } }(Tenga en cuenta que la conversión de una cadena a datos UTF-8 no puede fallar, no es necesario devolver un opcional).
CC_MD5 ha quedado obsoleto con iOS 13. En su lugar, puede usar CC_SHA256.
En iOS 13 y superior, hay un marco CryptoKit que es un envoltorio alrededor del marco CommonCrypto y alrededor de la función hash MD5.
import CryptoKit let d = "Hello" let r = Insecure.MD5.hash(data: d.data(using: .utf8)!) print(r) /*Output: MD5 digest: 8b1a9953c4611296a827abf8c47804d7*/