Как hash NSString с SHA1 в Swift?

В объективе-c это выглядит так:

#include  @implementation NSString (reverse) -(NSString*)sha1 { NSData *data = [self dataUsingEncoding:NSUTF8StringEncoding]; uint8_t digest[CC_SHA1_DIGEST_LENGTH]; CC_SHA1(data.bytes, (int)data.length, digest); NSMutableString *output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2]; for (int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++) [output appendFormat:@"%02x", digest[i]]; return output; } @end 

Мне нужно что-то подобное с Swift, возможно ли это?

Пожалуйста, покажите пример работы.

Ваш код Objective-C (с использованием категории NSString ) можно напрямую перевести на Swift (используя расширение String ).

Сначала вам нужно создать «мостовой заголовок» и добавить

 #import  

Затем:

 extension String { func sha1() -> String { let data = self.dataUsingEncoding(NSUTF8StringEncoding)! var digest = [UInt8](count:Int(CC_SHA1_DIGEST_LENGTH), repeatedValue: 0) CC_SHA1(data.bytes, CC_LONG(data.length), &digest) let output = NSMutableString(capacity: Int(CC_SHA1_DIGEST_LENGTH)) for byte in digest { output.appendFormat("%02x", byte) } return output as String } } println("Hello World".sha1()) 

Это можно записать немного короче и Swifter as

 extension String { func sha1() -> String { let data = self.dataUsingEncoding(NSUTF8StringEncoding)! var digest = [UInt8](count:Int(CC_SHA1_DIGEST_LENGTH), repeatedValue: 0) CC_SHA1(data.bytes, CC_LONG(data.length), &digest) let hexBytes = map(digest) { String(format: "%02hhx", $0) } return "".join(hexBytes) } } 

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

 extension String { func sha1() -> String { let data = self.dataUsingEncoding(NSUTF8StringEncoding)! var digest = [UInt8](count:Int(CC_SHA1_DIGEST_LENGTH), repeatedValue: 0) CC_SHA1(data.bytes, CC_LONG(data.length), &digest) let hexBytes = digest.map { String(format: "%02hhx", $0) } return hexBytes.joinWithSeparator("") } } 

Чтобы вернуть строку с кодировкой Base-64 вместо строки с шестнадцатеричным кодированием, просто замените

  let hexBytes = digest.map { String(format: "%02hhx", $0) } return hexBytes.joinWithSeparator("") 

с

  return NSData(bytes: digest, length: digest.count).base64EncodedStringWithOptions([]) 

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

 extension String { func sha1() -> String { let data = self.data(using: String.Encoding.utf8)! var digest = [UInt8](repeating: 0, count:Int(CC_SHA1_DIGEST_LENGTH)) data.withUnsafeBytes { _ = CC_SHA1($0, CC_LONG(data.count), &digest) } let hexBytes = digest.map { String(format: "%02hhx", $0) } return hexBytes.joined() } } 

Чтобы вернуть строку с кодировкой Base-64 вместо строки с шестнадцатеричным кодированием, просто замените

  let hexBytes = digest.map { String(format: "%02hhx", $0) } return hexBytes.joined() 

от

  return Data(bytes: digest).base64EncodedString() 

Чтобы получить результат как NSData , при условии, что вы включили в свой заголовок моста:

 extension NSData { func sha1() -> NSData? { let len = Int(CC_SHA1_DIGEST_LENGTH) let digest = UnsafeMutablePointer.alloc(len) CC_SHA1(bytes, CC_LONG(length), digest) return NSData(bytesNoCopy: UnsafeMutablePointer(digest), length: len) } } 

Также использует правильное распределение указателя. Вызвать это так:

 myString.dataUsingEncoding(NSUTF8StringEncoding)?.sha1() 

Если вам нужно шестнадцатеричное представление NSData , посмотрите на мой другой ответ .

Да, возможно, скопируйте этот class в свой проект. https://github.com/idrougge/sha1-swift

И это будет легко:

  SHA1.hexString(from: "myPhrase" )! 

Протестировано для быстрых 3 и быстрых 4.

Мы можем извлечь логику для шифрования строки, используя sha1 для трех шагов:

  1. Преобразование строки в объект Data
  2. Шифрование данных с использованием функции SHA1 для Data
  3. Преобразование объекта данных в шестнадцатеричную строку

ИМХО, это гораздо более читаемо, и эта версия не требует NSData.

  extension String { var sha1: String { guard let data = data(using: .utf8, allowLossyConversion: false) else { // Here you can just return empty string or execute fatalError with some description that this specific string can not be converted to data } return data.digestSHA1.hexString } } fileprivate extension Data { var digestSHA1: Data { var bytes: [UInt8] = Array(repeating: 0, count: Int(CC_SHA1_DIGEST_LENGTH)) withUnsafeBytes { _ = CC_SHA1($0, CC_LONG(count), &bytes) } return Data(bytes: bytes) } var hexString: String { return map { String(format: "%02x", UInt8($0)) }.joined() } } 

Да, возможно: сделать доступным этот код объектного кода c быстрым

См. Документацию .

Я бы не стал переписывать его быстрым, если вы не получите никакой пользы (например, с использованием особых функций).

Кроме того, в проекте, над которым я работаю, я использовал некоторый объективный код c, похожий на ваш, для обработки hashей. Вначале я начал писать его быстро, затем понял, что проще и лучше повторно использовать старый хороший obj-c.

  • Доступ к базе данных SQLite в Swift
  • NSRange для диапазона
  • Автоматическая компоновка: получить высоту UIImageView, чтобы правильно вычислить высоту ячейки
  • Как сериализовать или преобразовать объекты Swift в JSON?
  • Можно ли смешивать Swift с C ++? Как и файлы Objective - C .mm
  • Преобразование String для плавания в Apple Swift
  • Как я могу использовать UserDefaults в Swift?
  • swift: изменение массивов внутри словарей
  • Как декодировать HTML-объекты в swift?
  • Как получить текущее время как время
  • Swift - Захват ключа от NSViewController
  • Interesting Posts

    Android MediaPlayer отлично работает в приложении Custom Audio Streaming до Android 2.1, но не в более высоких версиях

    самый простой способ преобразования матрицы в один вектор строки

    Получение MathJax для обновления после изменений в модели AngularJS

    Json.NET (Newtonsoft.Json) – Два «свойства» с таким же именем?

    Есть ли способ посмотреть Netflix на Linux?

    ProgressDialog не отображается, когда AsyncTask.get () называется

    Ограничение размера хранилища HTML5 для субдоменов

    Haskell: Что такое нормальная форма слабой головы?

    Выберите каждую n-ю строку в Numbers

    Как я могу скопировать большой файл с одной машины Windows на другую предельную скорость передачи?

    Предоставляет ли компилятор возможность переработать освобожденные переменные указателя?

    Преобразование прозрачного PNG в JPG с нечерным цветом фона

    Spring 4 – addResourceHandlers не разрешает статические ресурсы

    Является ли внешний жесткий диск с металлическим чеканкой лучше для рассеивания тепла, чем пластиковый?

    Загрузить файл свойств в Servlet / JSP

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