func stringSha1(_ value: String) -> String {
let cstr = value.cString(using: String.Encoding.utf8)
let data = Data(bytes: cstr, length: (value.characters.count ?? 0))
let digest = [UInt8](repeating: 0, count: Int(CC_SHA1_DIGEST_LENGTH))
// This is an iOS5-specific method.
// It takes in the data, how much data, and then output format, which in this case is an int array.
CC_SHA1(data.bytes, (data.count as? uint), digest)
//NSLog(@"SHA1 Digest: %s",digest);
return stringHexEncode(digest, withLength: CC_SHA1_DIGEST_LENGTH)
}
它显示这样的错误: 参数标签'(字节:,length :)'不匹配任何可用的过载
直接解码到 Data
,不要使用 cString
。
let data = value.data(using: .utf8)
cString
是由零字符界定的C字符(CChar
(数组。你不想要那个。您需要一个字节的原始数组。
然后您必须使用unsafeBytes
:
var digest = [UInt8](repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH))
data.withUnsafeBytes {
_ = CC_SHA1($0, CC_LONG(self.count), &digest)
}
请注意,digest
是var
。digest
的内容将更改。
您可以在Data
上创建以下扩展名:
extension Data {
func sha1() -> Data {
var digest = [UInt8](repeating: 0, count: Int(CC_SHA1_DIGEST_LENGTH))
self.withUnsafeBytes {
_ = CC_SHA1($0, CC_LONG(self.count), &digest)
}
return Data(bytes: digest)
}
func hexEncodedString() -> String {
return self.map { String(format: "%02hhx", $0) }.joined()
}
}
那么您的代码可以简化为:
let digest = value
.data(using: .utf8)
.sha1()
.hexEncodedString()