2014-10-19 42 views
9

我想在我的Swift中的函數中使用CC_SHA256_DIGEST_LENGTH,它會拋出一個錯誤,因爲它找不到那個符號。我已經嘗試了一切,在bridge-header中導入CommonCrypto並嘗試.map解決方案。沒有任何工作。在Swift中的SHA256 - 導入框架問題

如何在Swift中使用CC_SHA256_DIGEST_LENGTH?所有的解決方案似乎都停止了工作。 謝謝!

+3

它總是有助於在問題中包含問題代碼和確切的完整錯誤信息。 – zaph 2014-10-19 12:37:49

+0

在這種情況下,框架版本也會很好。 – 2014-10-19 12:51:50

回答

20

以下行添加到你的橋接報頭:
#import <CommonCrypto/CommonHMAC.h>

夫特2.x的例子:

func doSha256(#dataIn:NSData) -> NSData { 
    var shaOut: NSMutableData! = NSMutableData(length: Int(CC_SHA256_DIGEST_LENGTH)); 
    CC_SHA256(dataIn.bytes, CC_LONG(dataIn.length), UnsafeMutablePointer<UInt8>(shaOut.mutableBytes)); 

    return shaOut; 
} 

夫特3.0例如:

func hashSHA256(data:Data) -> Data? { 
    var hashData = Data(count: Int(CC_SHA256_DIGEST_LENGTH)) 
    _ = hashData.withUnsafeMutableBytes {digestBytes in 
     data.withUnsafeBytes {messageBytes in 
      CC_SHA256(messageBytes, CC_LONG(data.count), digestBytes) 
     } 
    } 
    return hashData 
} 

let clearData = "clearData".data(using:String.Encoding.utf8)! 
print("clearData: \(clearData.map { String(format: "%02hhx", $0) }.joined())") 

let hash = hashSHA256(data:clearData) 
print("hash: \(hash!.map { String(format: "%02hhx", $0) }.joined())") 

輸出:

clearData:636c6561724461746130313233343536
哈希:aabc766b6b357564e41f4f912d494bccbfa16924b574abbdba9e3e9da0c8920a

我沒有在目標構建階段添加任何框架。
是你確定橋接頭設置正確嗎?我通過添加.m文件添加了我的文件,並讓系統自動添加橋接頭並更新任何目標設置。

通用哈希方法從已停用文檔部分移動:

此功能需要一個哈希名和待哈希數據並返回數據:

 
name: A name of a hash function as a String 
data: The Data to be hashed 
returns: the hashed result as Data 
func hash(name:String, data:Data) -> Data? { 
    let algos = ["MD2": (CC_MD2, CC_MD2_DIGEST_LENGTH), 
       "MD4": (CC_MD4, CC_MD4_DIGEST_LENGTH), 
       "MD5": (CC_MD5, CC_MD5_DIGEST_LENGTH), 
       "SHA1": (CC_SHA1, CC_SHA1_DIGEST_LENGTH), 
       "SHA224": (CC_SHA224, CC_SHA224_DIGEST_LENGTH), 
       "SHA256": (CC_SHA256, CC_SHA256_DIGEST_LENGTH), 
       "SHA384": (CC_SHA384, CC_SHA384_DIGEST_LENGTH), 
       "SHA512": (CC_SHA512, CC_SHA512_DIGEST_LENGTH)] 
    guard let (hashAlgorithm, length) = algos[name] else { return nil } 
    var hashData = Data(count: Int(length)) 

    _ = hashData.withUnsafeMutableBytes {digestBytes in 
     data.withUnsafeBytes {messageBytes in 
      hashAlgorithm(messageBytes, CC_LONG(data.count), digestBytes) 
     } 
    } 
    return hashData 
} 

注意: MD2,MD4,MD5和SHA1不應該用於新的工作,它們不再適用於消息摘要的使用。

+0

仍然收到錯誤「使用未解析的標識符CC_SHA256_DIGEST_LENGTH'」以及CC_LONG和CC_SHA256的錯誤。我在Bridge-header中導入了CommonCrypto導入。我是否需要爲該項目添加任何框架?不能得到這個工作:( – Hjalmar 2014-10-19 15:51:31

+0

最後!問題是,當我導入.m文件來生成橋接頭時,其中一個目標未勾選。感謝您的幫助! – Hjalmar 2014-10-19 16:32:45

+0

找到了它:http:// www.learnswiftonline.com/getting-started/adding-swift-bridging-header/哦,也很重要https://stackoverflow.com/questions/26096402/xcode-myprojectname-bridging-header-h-does-not-exist – pete 2017-07-15 21:10:21