我想SHA1 extention添加到字符串中swift3,得到错误
问题描述:
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)
}
它显示的错误是这样的: 参数标签“(字节长度:, :)”不匹配任何可用的重载我想SHA1 extention添加到字符串中swift3,得到错误
答
解码类型直接使用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()
不要使用一个CString。直接将字符串编码为数据。 – Sulthan
[swift 3 error:Argument labels'(\ _ :)'可能重复不匹配任何可用的重载](https://stackoverflow.com/questions/39443953/swift-3-error-argument-labels-do-不匹配任何可用重载) – Alexander
没有显示编码,它只显示cstring – shiva