我想SHA1 extention添加到字符串中swift3,得到错误

我想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,得到错误

+0

不要使用一个CString。直接将字符串编码为数据。 – Sulthan

+0

[swift 3 error:Argument labels'(\ _ :)'可能重复不匹配任何可用的重载](https://stackoverflow.com/questions/39443953/swift-3-error-argument-labels-do-不匹配任何可用重载) – Alexander

+0

没有显示编码,它只显示cstring – shiva

解码类型直接使用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()