2016-09-08 78 views
8

我正在嘗試獲取我的數據的MD5哈希(從網絡下載的圖像)。不幸的是,我已經將框架升級到swift 3,並且我一直使用的方法現在不起作用。數據在Swift 3中的MD5 3

我已經轉換的大部分,但我無法得到字節出來的數據:

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

這裏是[我的純Swift實現](https://github.com/NikolaiRuhe/SwiftDigest)不需要CommonCrypto。 –

回答

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

如前所述,bytes不可用,因爲它是危險的。這是一個可以消失的原始指針。推薦的解決方案是使用withUnsafeBytes,它承諾在指針範圍內目標不會消失。從內存中,它會是這個樣子:

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

的一點是,bytes指針不能逃進範圍,其中data不再有效。

有關CCHmac的一個示例,與MD5非常相似,請參閱RNCryptor

+0

我一直在尋找這個答案太長!謝謝 – Sn0wfreeze

+0

Swift是我使用過的更糟的語言之間的另一個原因:爲什麼不簡單地使用md5(blah:AnyObject) - > String :( –

+0

)你的建議語法非常模糊,會導致很大的混淆(同樣的困惑I經常遇到那些試圖在PHP和JavaScript中執行哈希的開發人員,並且得到意想不到的結果,我不得不通過修復來解決這些問題)但是,如果這不是從C中奇蹟般地橋接起來的,並且有適當的Swift接口,重新校正它永遠不應該看起來像這樣(因爲這個神奇的橋接語法非常難看)。它將是一個簡單的數據方法,並且會返回一個Data.Rebably Data.md5Hashed()或類似的東西。 –