您的Objective-C代碼(使用NSString
類別)可以直接轉換爲Swift (使用String
擴展名)。
首先,你必須創建一個 「橋接報」,並添加
#import <CommonCrypto/CommonCrypto.h>
然後:
extension String {
func sha1() -> String {
let data = self.dataUsingEncoding(NSUTF8StringEncoding)!
var digest = [UInt8](count:Int(CC_SHA1_DIGEST_LENGTH), repeatedValue: 0)
CC_SHA1(data.bytes, CC_LONG(data.length), &digest)
let output = NSMutableString(capacity: Int(CC_SHA1_DIGEST_LENGTH))
for byte in digest {
output.appendFormat("%02x", byte)
}
return output as String
}
}
println("Hello World".sha1())
這可以寫成略短,更快捷的爲
extension String {
func sha1() -> String {
let data = self.dataUsingEncoding(NSUTF8StringEncoding)!
var digest = [UInt8](count:Int(CC_SHA1_DIGEST_LENGTH), repeatedValue: 0)
CC_SHA1(data.bytes, CC_LONG(data.length), &digest)
let hexBytes = map(digest) { String(format: "%02hhx", $0) }
return "".join(hexBytes)
}
}
更新對於Swift 2:
extension String {
func sha1() -> String {
let data = self.dataUsingEncoding(NSUTF8StringEncoding)!
var digest = [UInt8](count:Int(CC_SHA1_DIGEST_LENGTH), repeatedValue: 0)
CC_SHA1(data.bytes, CC_LONG(data.length), &digest)
let hexBytes = digest.map { String(format: "%02hhx", $0) }
return hexBytes.joinWithSeparator("")
}
}
要返回Base64編碼串,而不是一個十六進制編碼的字符串, 只需更換
let hexBytes = digest.map { String(format: "%02hhx", $0) }
return hexBytes.joinWithSeparator("")
與
return NSData(bytes: digest, length: digest.count).base64EncodedStringWithOptions([])
更新夫特3:
extension String {
func sha1() -> String {
let data = self.data(using: String.Encoding.utf8)!
var digest = [UInt8](repeating: 0, count:Int(CC_SHA1_DIGEST_LENGTH))
data.withUnsafeBytes {
_ = CC_SHA1($0, CC_LONG(data.count), &digest)
}
let hexBytes = digest.map { String(format: "%02hhx", $0) }
return hexBytes.joined()
}
}
要返回Base64編碼字符串,而不是一個十六進制編碼字符串, 只需更換
let hexBytes = digest.map { String(format: "%02hhx", $0) }
return hexBytes.joined()
通過
return Data(bytes: digest).base64EncodedString()
是否有可能不使用obj-c橋接頭?我在尋找乾淨的Swift解決方案。 – 2014-12-16 18:32:23
@MihaelIsaev:你的意思是「乾淨的Swift解決方案」?你想在Swift中重新實現算法嗎?我不會推薦它,因爲CommonCrypto是一個可行的解決方案。但你可以看看https://github.com/krzyzanowskim/CryptoSwift。 – 2014-12-16 18:48:56
是的,我想要一些我可以在沒有obj-c橋接的情況下使用的庫。不幸的是https://github.com/krzyzanowskim/CryptoSwift它使用OBJ-C橋接太:( – 2014-12-16 19:46:52