Come utilizzare il metodo CC_MD5 in linguaggio rapido.

in ogg-c, possiamo cifrare una stringa con md5 con i seguenti codici

const char *cStr = [someString UTF8String]; unsigned char result[16]; CC_MD5( cStr, strlen(cStr), result ); md5String = [NSString stringWithFormat: @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x", result[0], result[1], result[2], result[3], result[4], result[5], result[6], result[7], result[8], result[9], result[10], result[11], result[12], result[13], result[14], result[15] ]; 

ma ora CC_MD5 non funziona in modo rapido. Come gestirlo

Questo è quello che mi è venuto in mente. È un’estensione di String. Non dimenticare di aggiungere #import all’intestazione di bridging ObjC-Swift creata da Xcode.

 extension String { var md5: String! { let str = self.cStringUsingEncoding(NSUTF8StringEncoding) let strLen = CC_LONG(self.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)) let digestLen = Int(CC_MD5_DIGEST_LENGTH) let result = UnsafeMutablePointer.alloc(digestLen) CC_MD5(str!, strLen, result) let hash = NSMutableString() for i in 0.. 

Ecco la mia versione in Swift 3.0, credo che sia più sicura e più veloce delle altre risposte qui.

È richiesta un’intestazione di bridging con #import .

 func MD5(_ string: String) -> String? { let length = Int(CC_MD5_DIGEST_LENGTH) var digest = [UInt8](repeating: 0, count: length) if let d = string.data(using: String.Encoding.utf8) { _ = d.withUnsafeBytes { (body: UnsafePointer) in CC_MD5(body, CC_LONG(d.count), &digest) } } return (0.. 

Ho fatto l’implementazione pura di MD5 come parte del progetto CryptoSwift .

Potrei copiare il codice qui ma utilizza le estensioni che fanno parte di questo progetto, quindi potrebbe essere inutile per l’utilizzo di copia e incolla. Comunque puoi dare un’occhiata lì e usarlo.

Quindi ecco la soluzione e so che risparmierà il tuo tempo al 100%

BridgingHeader -> Utilizzato per esporre il codice Objective-c in un progetto Swift

CommonCrypto -> è il file necessario per usare l’ hash md5

Poiché Common Crypto è un file Objective-c, è necessario utilizzare BridgingHeader per utilizzare il metodo necessario per l’hashing


(per esempio)

 extension String { func md5() -> String! { let str = self.cStringUsingEncoding(NSUTF8StringEncoding) let strLen = CUnsignedInt(self.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)) let digestLen = Int(CC_MD5_DIGEST_LENGTH) let result = UnsafeMutablePointer.alloc(digestLen) CC_MD5(str!, strLen, result) var hash = NSMutableString() for i in 0.. 

}

Come aggiungere Common Crypto in un progetto Swift ??

Questo collegamento ti insegnerà come (PASSO dopo PASSO).

Raccomando l'uso di Bridging Header

************* Aggiornato Swift 3 ****************

 extension String { func toMD5() -> String { if let messageData = self.data(using:String.Encoding.utf8) { 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.hexString() } return self } } extension Data { func hexString() -> String { let string = self.map{ String($0, radix:16) }.joined() return string } } 

Come usare?

let stringConvertedToMD5 = "foo" .toMD5 ()

Xcode 6 beta 5 ora utilizza un UnsafeMutablePointer al posto di UnsafePointer . La conversione delle stringhe richiede anche il format: label argomento.

 extension String { func md5() -> String! { let str = self.cStringUsingEncoding(NSUTF8StringEncoding) let strLen = CUnsignedInt(self.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)) let digestLen = Int(CC_MD5_DIGEST_LENGTH) let result = UnsafeMutablePointer.alloc(digestLen) CC_MD5(str!, strLen, result) var hash = NSMutableString() for i in 0.. 

in ogni caso se vuoi calcolare MD5 su NSData, dai un’occhiata a questo:

 func md5() -> NSData { var ctx = UnsafePointer.alloc(sizeof(CC_MD5_CTX)) CC_MD5_Init(ctx); CC_MD5_Update(ctx, self.bytes, UInt32(self.length)); let length = Int(CC_MD5_DIGEST_LENGTH) * sizeof(Byte) var output = UnsafePointer.alloc(length) CC_MD5_Final(output, ctx); let outData = NSData(bytes: output, length: Int(CC_MD5_DIGEST_LENGTH)) output.destroy() ctx.destroy() //withUnsafePointer return outData; } 

avere un’idea

È necessario importare #import in Bridging Header

Sto calcolando l’hash MD5, ma usando solo il primo 16 byte che sto usando

 class func hash(data: NSData) -> String { let data2 = NSMutableData(length: Int(CC_MD5_DIGEST_LENGTH))! CC_MD5(data.bytes, CC_LONG(data.length), UnsafeMutablePointer(data2.mutableBytes)) let data3 = UnsafePointer(data2.bytes) var hash = "" for (var i = 0; i < 16; ++i) { hash += String(format: "%02X", data3[i]) } return hash } 

Per i casi in cui un’intestazione di bridging non è un’opzione (ad esempio, in uno script di shell), è ansible utilizzare lo strumento della riga di comando /sbin/md5 tramite NSTask :

 import Foundation func md5hash(string: String) -> String { let t = NSTask() t.launchPath = "/sbin/md5" t.arguments = ["-q", "-s", string] t.standardOutput = NSPipe() t.launch() let outData = t.standardOutput.fileHandleForReading.readDataToEndOfFile() var outBytes = [UInt8](count:outData.length, repeatedValue:0) outData.getBytes(&outBytes, length: outData.length) var outString = String(bytes: outBytes, encoding: NSASCIIStringEncoding) assert(outString != nil, "failed to md5 input string") return outString!.stringByTrimmingCharactersInSet(NSCharacterSet.newlineCharacterSet()) } 

Uso:

 let md5 = md5hash("hello world") // 5eb63bbbe01eeed093cb22bb8f5acdc3 

Ecco alcune correzioni che ho dovuto apportare a questo codice per farlo funzionare in Swift 5

  func md5(inString: String) -> String! { let str = inString.cString(using: String.Encoding.utf8) let strLen = CUnsignedInt(inString.lengthOfBytes(using: String.Encoding.utf8)) let digestLen = Int(CC_MD5_DIGEST_LENGTH) let result = UnsafeMutablePointer.allocate(capacity: digestLen) CC_MD5(str!, strLen, result) var hash = NSMutableString() for i in 0..