2016-09-08 4 views
8

私のデータ(インターウェブからダウンロードしたイメージ)の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を必要としない[my pure Swift implementation](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ポインタがスコープに逃げることができないということです。

CCHmacの例は、MD5とよく似ていますが、RNCryptorを参照してください。

+0

私はこの回答方法が長すぎるのを探していました!ありがとうございました – Sn0wfreeze

+0

スウィフトが私がこれまでに使ってきた言語の中でも、もうひとつの理由は何ですか:単純にmd5(blah:AnyObject) - > String :( –

+0

あなたの提案する構文は非常にあいまいで、 PHPやJavaScriptでハッシュを実行しようとする開発者に遭遇し、予期せぬ不正確な結果を得て、修正する必要があります)しかし、これがCから魔法のようにブリッジされておらず、適切なSwiftインターフェイスを持っていれば、 (これは魔法のようにブリッジされた構文が非常に醜いので)これは決してこれのように見えるべきではありません。それはDataの簡単なメソッドであり、Dataを返します。おそらくData.md5Hashed() –

関連する問題