SHA256 в быстрой

Я хочу использовать sha256 в моем проекте, но у меня возникли проблемы с перекодировкой кода objC в быстрый код. Помоги мне, пожалуйста. Я использовал этот ответ: как я могу вычислить hash SHA-2 (в идеале SHA 256 или SHA 512) в iOS?

Вот мой код

var hash : [CUnsignedChar] CC_SHA256(data.bytes, data.length, hash) var res : NSData = NSData.dataWithBytes(hash, length: CC_SHA256_DIGEST_LENGTH) 

это дает мне ошибку все, потому что swift не может преобразовать Int в CC_LONG , например.

Вы должны явно конвертировать между Int и CC_LONG , поскольку Swift не выполняет неявные преобразования, как в (Objective-) C.

Вы также должны определить hash как массив требуемого размера.

 func sha256(data : NSData) -> NSData { var hash = [UInt8](count: Int(CC_SHA256_DIGEST_LENGTH), repeatedValue: 0) CC_SHA256(data.bytes, CC_LONG(data.length), &hash) let res = NSData(bytes: hash, length: Int(CC_SHA256_DIGEST_LENGTH)) return res } 

Кроме того, вы можете использовать NSMutableData для выделения необходимого буфера:

 func sha256(data : NSData) -> NSData { let res = NSMutableData(length: Int(CC_SHA256_DIGEST_LENGTH)) CC_SHA256(data.bytes, CC_LONG(data.length), UnsafeMutablePointer(res.mutableBytes)) return res } 

Обновление для Swift 3:

 func sha256(data : Data) -> Data { var hash = [UInt8](repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH)) data.withUnsafeBytes { _ = CC_SHA256($0, CC_LONG(data.count), &hash) } return Data(bytes: hash) } 

Главный ответ мне не помог. Я нашел что-то в Интернете и немного изменил его, и теперь он работает: D. Это для Swift 3 и 4.

Поместите это расширение где-нибудь в свой проект и используйте его в строке, подобной этой: mystring.sha256 ()

 extension String { func sha256() -> String{ if let stringData = self.data(using: String.Encoding.utf8) { return hexStringFromData(input: digest(input: stringData as NSData)) } return "" } private func digest(input : NSData) -> NSData { let digestLength = Int(CC_SHA256_DIGEST_LENGTH) var hash = [UInt8](repeating: 0, count: digestLength) CC_SHA256(input.bytes, UInt32(input.length), &hash) return NSData(bytes: hash, length: digestLength) } private func hexStringFromData(input: NSData) -> String { var bytes = [UInt8](repeating: 0, count: input.length) input.getBytes(&bytes, length: input.length) var hexString = "" for byte in bytes { hexString += String(format:"%02x", UInt8(byte)) } return hexString } } 

Кстати, вам нужен заголовок Bridging Header, который импортирует CommonCrypto. Если у вас нет одного, выполните следующие действия:

  1. Создать новый файл -> Файл заголовка -> Сохранить как BridgingHeader
  2. В настройках сборки -> Objective-C Bridging Header -> add ProjectName/BridgingHeader.h
  3. Поместите #import в файл заголовка

Функции, дающие SHA из NSData & String (Swift 3):

 func sha256(_ data: Data) -> Data? { guard let res = NSMutableData(length: Int(CC_SHA256_DIGEST_LENGTH)) else { return nil } CC_SHA256((data as NSData).bytes, CC_LONG(data.count), res.mutableBytes.assumingMemoryBound(to: UInt8.self)) return res as Data } func sha256(_ str: String) -> String? { guard let data = str.data(using: String.Encoding.utf8), let shaData = sha256(data) else { return nil } let rc = shaData.base64EncodedString(options: []) return rc } 

Включить в заголовок моста:

 #import "CommonCrypto/CommonCrypto.h" 

Вот метод, который использует API преобразования CoreFoundation Security Transforms, поэтому вам даже не нужно ссылаться на CommonCrypto. По какой-то причине в 10.10 / Xcode 7 ссылка на CommmonCrypto с Swift – это драма, поэтому я использовал это вместо этого.

Этот метод читается из NSInputStream , который вы можете получить из файла, или вы можете сделать тот, который читает NSData , или вы можете создавать связанные streamи чтения / записи для буферизованного процесса.

 // digestType is from SecDigestTransform and would be kSecDigestSHA2, etc func digestForStream(stream : NSInputStream, digestType type : CFStringRef, length : Int) throws -> NSData { let transform = SecTransformCreateGroupTransform().takeRetainedValue() let readXform = SecTransformCreateReadTransformWithReadStream(stream as CFReadStreamRef).takeRetainedValue() var error : Unmanaged? = nil let digestXform : SecTransformRef = try { let d = SecDigestTransformCreate(type, length, &error) if d == nil { throw error!.takeUnretainedValue() } else { return d.takeRetainedValue() } }() SecTransformConnectTransforms(readXform, kSecTransformOutputAttributeName, digestXform, kSecTransformInputAttributeName, transform, &error) if let e = error { throw e.takeUnretainedValue() } if let output = SecTransformExecute(transform, &error) as? NSData { return output } else { throw error!.takeUnretainedValue() } } 

Вот моя простая 3-строчная функция Swift 4 для этого, используя API Transforms безопасности, который является частью Foundation на macOS. (К сожалению, программисты iOS не могут использовать эту технику.)

 import Foundation extension Data { public func sha256Hash() -> Data { let transform = SecDigestTransformCreate(kSecDigestSHA2, 256, nil) SecTransformSetAttribute(transform, kSecTransformInputAttributeName, self as CFTypeRef, nil) return SecTransformExecute(transform, nil) as! Data } } 

Я предпочитаю использовать:

 extension String { var sha256:String? { guard let stringData = self.data(using: String.Encoding.utf8) else { return nil } return digest(input: stringData as NSData).base64EncodedString(options: []) } private func digest(input : NSData) -> NSData { let digestLength = Int(CC_SHA256_DIGEST_LENGTH) var hash = [UInt8](repeating: 0, count: digestLength) CC_SHA256(input.bytes, UInt32(input.length), &hash) return NSData(bytes: hash, length: digestLength) } } 

Разбитая строка кодируется base64.

  • Можно ли реплицировать автоматическое числовое преобразование Swifts в Foundation (NSNumber) для типов (U) Int8 / 16/32/64?
  • Итерация через словарь в Swift
  • Предупреждение об ошибке «C-style for Statement устарел» в Swift 3
  • Быстрые расширения протоколов
  • Как декодировать HTML-объекты в swift?
  • Что такое ошибка связи: OS_xpc_error в Xcode 6?
  • Как использовать stringByAddingPercentEncodingWithAllowedCharacters () для URL-адреса в Swift 2.0
  • iOS 7 - Как отобразить выбор даты в виде таблицы?
  • Расширять типы массивов, используя предложение where в Swift
  • Массивы декодирования Swift JSONDecode терпят неудачу, если сбой одного элемента
  • NSDateFormatter возвращает неверную дату + Swift
  • Interesting Posts

    Java: инициализировать несколько переменных для цикла init?

    Как написать PHP-тернарный оператор

    Как перемещать макет, когда отображается мягкая клавиатура Android

    Как отменить запрос $ http в AngularJS?

    Является ли значение Linq Count () более быстрым или медленным, чем List.Count или Array.Length?

    Clearcase UCM пытается объединить файлы PDF

    Как переназначить последовательности с несколькими ключами на отдельные клавиши?

    Поиск подсказки пользовательской функции Excel

    Как изменить css display none или заблокировать свойство с помощью JQuery?

    Как сгруппировать по 2 дочерним объектам и получить общее количество обоих этих дочерних объектов?

    «Запрошенная страница не может быть подана из-за конфигурации расширения.» Сообщение об ошибке

    Большая функция Excel с дубликатами

    Можно ли запускать Windows без GUI?

    Постоянный туннель

    Почему «использование пространства имен std» считается плохой практикой?

    Давайте будем гением компьютера.