2017-05-30 2 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) 
} 

il montre l'erreur comme ceci: étiquettes Argument « (octets :, longueur :) » ne correspondent pas disponible surchargeJe suis en train d'ajouter à SHA1 extention chaîne dans swift3, Obtenir des erreurs

+0

Dont utiliser un CSTRING. Encodez directement la chaîne en données. – Sulthan

+0

Copie possible de [erreur 3 rapide: les étiquettes d'argument '(\ _ :)' ne correspondent à aucune surcharge disponible] (https://stackoverflow.com/questions/39443953/swift-3-error-argument-labels-do- ne correspond pas aux surcharges disponibles) – Alexander

+0

Il n'y a pas d'encodage, il montre seulement cstring – shiva

Répondre

0

Decode à Data directement, n'utilisez pas cString.

let data = value.data(using: .utf8) 

cString est un tableau de caractères C (CChar) délimitées par un caractère nul. Tu ne veux pas ça. Vous avez besoin d'un tableau brut d'octets.

Ensuite, vous devez utiliser unsafeBytes:

var digest = [UInt8](repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH)) 

data.withUnsafeBytes { 
    _ = CC_SHA1($0, CC_LONG(self.count), &digest) 
} 

Notez que digest est un var. Le contenu de digest va changer.

Vous pouvez créer l'extension suivante sur 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() 
    } 
} 

Ensuite, votre code peut être simplifié à:

let digest = value 
    .data(using: .utf8) 
    .sha1() 
    .hexEncodedString()