Mã mục tiêu-C của bạn (sử dụng danh mục NSString
) có thể được dịch trực tiếp sang Swift (sử dụng tiện ích mở rộng String
).
Trước tiên, bạn phải tạo một "cầu nối tiêu đề" và thêm
#import <CommonCrypto/CommonCrypto.h>
Sau đó:
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())
này có thể được viết hơi ngắn hơn và mau lẹ như
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)
}
}
Cập nhật cho 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("")
}
}
Để trở về một Base-64 chuỗi mã hóa thay vì một chuỗi hex mã hóa, chỉ cần thay thế
let hexBytes = digest.map { String(format: "%02hhx", $0) }
return hexBytes.joinWithSeparator("")
với
return NSData(bytes: digest, length: digest.count).base64EncodedStringWithOptions([])
Cập nhật cho Swift 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()
}
}
Để trở về một Base-64 chuỗi mã hóa thay vì một chuỗi hex mã hóa, chỉ cần thay thế
let hexBytes = digest.map { String(format: "%02hhx", $0) }
return hexBytes.joined()
bởi
return Data(bytes: digest).base64EncodedString()
Có thể không sử dụng tiêu đề cầu nối obj-c không? Tôi tìm kiếm giải pháp Swift sạch. –
@MihaelIsaev: Ý của bạn là "giải pháp Swift sạch"? Bạn có muốn * tái triển khai * các thuật toán trong Swift không? Tôi sẽ không khuyên bạn nên nó vì CommonCrypto là một giải pháp được thiết lập làm việc. Nhưng bạn có thể xem https://github.com/krzyzanowskim/CryptoSwift. –
Vâng, tôi muốn một số thư viện mà tôi có thể sử dụng mà không có obj-c cầu nối. Thật không may https://github.com/krzyzanowskim/CryptoSwift nó đang sử dụng cầu nối obj-c quá: ( –