2017-05-30 22 views
0
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) 
} 

の取得、swift3に文字列にSHA1の拡張子を追加しようとしています: 引数ラベル「(バイト:,長さは:)」に使用可能な任意のオーバーロードに私はそれがこのようなエラーを示し、エラー

+0

いけないのCStringを使用しています。 Stringをデータに直接エンコードする。 – Sulthan

+0

[swift 3エラー:引数ラベル '(\ _ :)'と使用可能なオーバーロードが一致しません)の重複が考えられます(https://stackoverflow.com/questions/39443953/swift-3-error-argument-labels-do-不一致 - 使用可能なオーバーロード) – Alexander

+0

エンコーディングを表示していません、cstringのみを表示します – shiva

答えて

0

デコードと一致しません直接DatacStringを使用しないでください。

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) 
} 

digestvarであること。 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() 
関連する問題