Я пытаюсь добавить расширение 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)
}

он показывает такую ​​​​ошибку: метки аргументов «(bytes:, length:)» не соответствуют ни одной из доступных перегрузок.


person shiva    schedule 30.05.2017    source источник
comment
Не используйте cString. Кодировать строку в данные напрямую.   -  person Sulthan    schedule 30.05.2017
comment
Возможный дубликат ошибки swift 3: Метки аргументов ' (_:)' не соответствуют ни одной из доступных перегрузок   -  person Alexander    schedule 30.05.2017
comment
Не показывает кодировку, показывает только cstring   -  person shiva    schedule 30.05.2017


Ответы (1)


Декодируйте напрямую в 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()
person Sulthan    schedule 30.05.2017