我正在尝试将SHA1扩展添加到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)
}

它显示这样的错误: 参数标签'(字节:,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)
}

请注意,digestvardigest的内容将更改。

您可以在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()

最新更新