在objective-c中它看起来像这样:
#include <sys/xattr.h>
@implementation NSString (reverse)
-(NSString*)sha1
{
NSData *data = [self dataUsingEncoding:NSUTF8StringEncoding];
uint8_t digest[CC_SHA1_DIGEST_LENGTH];
CC_SHA1(data.bytes, (int)data.length, digest);
NSMutableString *output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
for (int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++)
[output appendFormat:@"%02x", digest[i]];
return output;
}
@end
Run Code Online (Sandbox Code Playgroud)
我需要Swift这样的东西,有可能吗?
请展示工作示例.
Mar*_*n R 160
您的Objective-C代码(使用NSString
类别)可以直接转换为Swift(使用String
扩展名).
首先,你必须创建一个"桥接头"并添加
#import <CommonCrypto/CommonCrypto.h>
Run Code Online (Sandbox Code Playgroud)
然后:
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())
Run Code Online (Sandbox Code Playgroud)
这可以写得稍短,Swifter也可以
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)
}
}
Run Code Online (Sandbox Code Playgroud)
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("")
}
}
Run Code Online (Sandbox Code Playgroud)
要返回Base-64编码的字符串而不是十六进制编码的字符串,只需替换
let hexBytes = digest.map { String(format: "%02hhx", $0) }
return hexBytes.joinWithSeparator("")
Run Code Online (Sandbox Code Playgroud)
同
return NSData(bytes: digest, length: digest.count).base64EncodedStringWithOptions([])
Run Code Online (Sandbox Code Playgroud)
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()
}
}
Run Code Online (Sandbox Code Playgroud)
要返回Base-64编码的字符串而不是十六进制编码的字符串,只需替换
let hexBytes = digest.map { String(format: "%02hhx", $0) }
return hexBytes.joined()
Run Code Online (Sandbox Code Playgroud)
通过
return Data(bytes: digest).base64EncodedString()
Run Code Online (Sandbox Code Playgroud)
dua*_*uan 10
随着CryptoKit
iOS13 的加入,我们现在有了原生的 Swift API:
import Foundation
import CryptoKit
// CryptoKit.Digest utils
extension Digest {
var bytes: [UInt8] { Array(makeIterator()) }
var data: Data { Data(bytes) }
var hexStr: String {
bytes.map { String(format: "%02X", $0) }.joined()
}
}
func example() {
guard let data = "hello world".data(using: .utf8) else { return }
let digest = Insecure.SHA1.hash(data: data)
print(digest.data) // 20 bytes
print(digest.hexStr) // 2AAE6C35C94FCFB415DBE95F408B9CE91EE846ED
}
Run Code Online (Sandbox Code Playgroud)
Swift 5 的版本在 iOS 13 上使用 CryptoKit,否则会回退到 CommonCrypto:
import CommonCrypto
import CryptoKit
import Foundation
private func hexString(_ iterator: Array<UInt8>.Iterator) -> String {
return iterator.map { String(format: "%02x", $0) }.joined()
}
extension Data {
public var sha1: String {
if #available(iOS 13.0, *) {
return hexString(Insecure.SHA1.hash(data: self).makeIterator())
} else {
var digest = [UInt8](repeating: 0, count: Int(CC_SHA1_DIGEST_LENGTH))
self.withUnsafeBytes { bytes in
_ = CC_SHA1(bytes.baseAddress, CC_LONG(self.count), &digest)
}
return hexString(digest.makeIterator())
}
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
let string = "The quick brown fox jumps over the lazy dog"
let hexDigest = string.data(using: .ascii)!.sha1
assert(hexDigest == "2fd4e1c67a2d28fced849ee1bb76e7391b93eb12")
Run Code Online (Sandbox Code Playgroud)
也可通过 Swift 包管理器获取: https:
//github.com/ralfebert/TinyHashes
是的,有可能,将此类复制到您的项目中。 https://github.com/idrougge/sha1-swift
这将很容易,例如:
SHA1.hexString(from: "myPhrase" )!
Run Code Online (Sandbox Code Playgroud)
已针对 swift 3 和 swift 4 进行测试。
归档时间: |
|
查看次数: |
30954 次 |
最近记录: |