2016-09-08 4 views
8

내 데이터 (interweb에서 다운로드 한 이미지)의 MD5 해시를 얻으려고합니다. 불행히도 프레임 워크를 신속하게 3으로 업그레이드했으며 지금 사용하고있는 방법이 작동하지 않습니다.스위프트 3의 MD5 데이터

나는 그것의 대부분을 변환 한하지만 데이터에서 바이트를 얻을 수 없습니다입니다 :

import Foundation 
import CommonCrypto 


struct MD5 { 

    static func get(data: Data) -> String { 
     var digest = [UInt8](repeating: 0, count: Int(CC_MD5_DIGEST_LENGTH)) 
     CC_MD5(data.bytes, CC_LONG(data.count), &digest) 

     var digestHex = "" 
     for index in 0..<Int(CC_MD5_DIGEST_LENGTH) { 
      digestHex += String(format: "%02x", digest[index]) 
     } 

     return digestHex 
    } 

} 

CommonCrypto 이미 사용자 지정 모듈로 가져옵니다. 문제가 발생했습니다 'bytes' is unavailable: use withUnsafeBytes insteadCC_MD5(data.bytes,...

그래서 정말 문제가 있습니다. 어떻게 데이터에서 바이트를 가져와이 솔루션이 작동합니까?

+0

CommonCrypto가 필요없는 [내 순수 Swift 구현] (https://github.com/NikolaiRuhe/SwiftDigest)입니다. –

답변

13
CC_MD5(data.bytes, CC_LONG(data.count), &digest) 

언급했듯이 bytes은 위험하기 때문에 사용할 수 없습니다. 그것은 사라질 수있는 것보다 메모리에 대한 원시 포인터입니다. 권장되는 해결책은 포인터 범위 내에서 대상이 사라지지 않을 것이라고 약속하는 withUnsafeBytes을 사용하는 것입니다. 메모리에서, 그것은 다음과 같이 보일 것입니다 :

data.withUnsafeBytes { bytes in 
    CC_MD5(bytes, CC_LONG(data.count), &digest) 
} 

포인트는 data가 더 이상 유효하지 않습니다 어디 bytes 포인터가 범위에 벗어날 수 있다는 것입니다.

MD5과 매우 유사한 CCHmac의 예를 보려면 RNCryptor을 참조하십시오.

+0

나는이 응답 방법을 너무 오랫동안 찾고 있었다! 고마워요 – Sn0wfreeze

+0

스위프트가 내가 사용했던 언어 중 가장 나쁜 언어 중 하나 인 또 다른 이유는 간단합니다. 왜 md5 (blah : AnyObject) -> String :( –

+0

제안 된 구문이 매우 모호하며 심각한 혼란을 낳을 수 있습니다. PHP와 JavaScript에서 해시를 시도하고 예기치 못한 결과를 얻으려는 개발자들과 종종 마주칩니다.)하지만 그렇다고해서 이것이 C에서 마술처럼 연결되어 있지 않고 적절한 Swift 인터페이스를 가지고 있다면, 다시 올바른 (이 마법 같은 브리지 구문이 매우 못 생겼기 때문에) 이처럼 보이지 않아야합니다. 이것은 데이터에 대한 간단한 방법 일 것이고 데이터를 반환합니다. 아마 Data.md5Hashed() 또는 유사 할 것입니다. –