Подтвердить что ты не робот

Как использовать метод CC_MD5 в быстром языке.

в objective-c. Мы можем зашифровать строку с помощью md5 следующими кодами

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]
        ];

но теперь CC_MD5 не работает быстро. Как справиться с этим.

4b9b3361

Ответ 1

Вот что я придумал. Это расширение для String. Не забудьте добавить #import <CommonCrypto/CommonCrypto.h> в заголовок моста ObjC-Swift, который создает 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<CUnsignedChar>.alloc(digestLen)

        CC_MD5(str!, strLen, result)

        let hash = NSMutableString()
        for i in 0..<digestLen {
            hash.appendFormat("%02x", result[i])
        }

        result.dealloc(digestLen)

        return String(format: hash as String)
    }
 }

Ответ 2

Здесь моя версия в Swift 3.0, я считаю, что это безопаснее и быстрее, чем другие ответы здесь.

Требуется соединительный заголовок с #import <CommonCrypto/CommonCrypto.h>.

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<UInt8>) in
            CC_MD5(body, CC_LONG(d.count), &digest)
        }
    }

    return (0..<length).reduce("") {
        $0 + String(format: "%02x", digest[$1])
    }
}

Ответ 3

Я сделал чистую реализацию Swift для MD5 как часть проекта CryptoSwift.

Я мог бы скопировать код здесь, но он использует расширения, которые являются частью этого проекта, поэтому он может быть бесполезным для копирования и использования вставки. Однако вы можете взглянуть туда и использовать его.

Ответ 4

Итак, вот решение, и я знаю, что он сэкономит ваше время 100%

BridgingHeader  - > Используется для Expose Objective-c code для Swift Project

CommonCrypto  - > это файл, необходимый для использования md5 хэша

Так как Common Crypto является Objective-c файлом, вам нужно использовать BridgingHeader для использования метода, необходимого для хэширования


(например)

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<CUnsignedChar>.alloc(digestLen)
    CC_MD5(str!, strLen, result)
    var hash = NSMutableString()
    for i in 0..<digestLen {
        hash.appendFormat("%02x", result[i])
    }
    result.destroy()
    return String(format: hash as String)
}

}

Как добавить Common Crypto в Swift Project

Эта ссылка научит вас, как (STEP by STEP).

Я рекомендую использовать заголовок

************* Обновлен 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
    }

}

Как использовать?

let stringConvertedToMD5 = "foo".toMD5()

Ответ 5

evntually, если вы хотите вычислить MD5 из NSData, взгляните на это:

func md5() -> NSData {
    var ctx = UnsafePointer<CC_MD5_CTX>.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<Byte>.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;
}

чтобы получить представление.

Ответ 6

Xcode 6 beta 5 теперь использует UnsafeMutablePointer вместо UnsafePointer. Для преобразования строк также требуется метка аргумента format:.

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<CUnsignedChar>.alloc(digestLen)
        CC_MD5(str!, strLen, result)
        var hash = NSMutableString()
        for i in 0..<digestLen {
            hash.appendFormat("%02x", result[i])
        }
        result.destroy()
        return String(format: hash)
    }
}

Ответ 7

В случаях, когда заголовок с мостом не является параметром (например, в оболочке script), вы можете использовать инструмент командной строки /sbin/md5 через 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())
}

Использование:

let md5 = md5hash("hello world")

// 5eb63bbbe01eeed093cb22bb8f5acdc3

Ответ 8

Нужно импортировать #import <CommonCrypto/CommonCrypto.h> в Консоль верхнего уровня

Я вычисляю хэш MD5, но используя только первый 16-байтовый я использую

class func hash(data: NSData) -> String {

    let data2 = NSMutableData(length: Int(CC_MD5_DIGEST_LENGTH))!
    CC_MD5(data.bytes, CC_LONG(data.length), UnsafeMutablePointer<UInt8>(data2.mutableBytes))
    let data3 =  UnsafePointer<CUnsignedChar>(data2.bytes)

    var hash = ""
    for (var i = 0; i < 16; ++i) {

        hash +=  String(format: "%02X", data3[i])
    }

    return hash
}