Nano Hash - криптовалюты, майнинг, программирование

Предупреждающее сообщение: как удалить 'withUnsafeMutableBytes' устарел, а 'withUnsafeBytes' устарел?

Я меняю код с предыдущей версии Swift на Swift5. И появляется предупреждающее сообщение, что этот код недоступен. Я хотел бы изменить этот код, но я не знаю, как это сделать.

код предупреждения

 func pbkdf2(hash: CCPBKDFAlgorithm, password: String, salt: Data, keyByteCount: Int, round: Int) -> Data? {
        let passwordData = password.data(using: .utf8)!
        let derivedKeyData = Data(count: keyByteCount)
        var localVariables = derivedKeyData
        let derivationStatus = localVariables.withUnsafeMutableBytes { derivedKeyBytes  in
            salt.withUnsafeBytes { saltBytes in
                CCKeyDerivationPBKDF(CCPBKDFAlgorithm(kCCPBKDF2),
                                     password, passwordData.count, saltBytes, salt.count,
                                     hash, UInt32(round),
                                     derivedKeyBytes, derivedKeyData.count)
            }
        }

        if (derivationStatus != 0) {
            Log.Error("\(derivationStatus)")
            return nil;
        }

        return localVariables
    }

Предупреждающее сообщение:

'withUnsafeMutableBytes' устарел: вместо этого используйте withUnsafeMutableBytes<R>(_: (UnsafeMutableRawBufferPointer) throws -> R) rethrows -> R

'withUnsafeBytes' устарел: вместо этого используйте withUnsafeBytes<R>(_: (UnsafeRawBufferPointer) throws -> R) rethrows -> R

Как изменить этот код, чтобы удалить предупреждающее сообщение?

Я пробовал много вещей, но ошибка изменилась.

func pbkdf2(hash: CCPBKDFAlgorithm, password: String, salt: Data, keyByteCount: Int, round: Int) -> Data? {
  let passwordData = password.data(using: .utf8)!
  let derivedKeyData = Data(count: keyByteCount)
  var localVariables = derivedKeyData
  let derivationStatus = localVariables.withUnsafeMutableBytes { derivedKeyBytes  in
     let Mutable: UnsafeMutableRawPointer? = derivedKeyBytes.baseAddress
     salt.withUnsafeBytes { saltBytes in
           let raw: UnsafeRawPointer? = saltBytes.baseAddress
              CCKeyDerivationPBKDF(CCPBKDFAlgorithm(kCCPBKDF2),
                                     password, passwordData.count, raw?.assumingMemoryBound(to: UInt8.self), salt.count,
                                     hash, UInt32(round),
                                     Mutable?.assumingMemoryBound(to: UInt8.self) , derivedKeyData.count)
            }
        }

        if (derivationStatus != 0) {
            Log.Error("\(derivationStatus)")
            return nil;
        }

        return localVariables
    }

Сообщение об ошибке:

Бинарный оператор '!=' нельзя применять к операндам типа '()' и 'Int'

Предупреждающее сообщение:

Предполагается, что константа 'derivationStatus' имеет тип '()', что может быть неожиданным.

Имею ли я право изменить его? Я думаю, мне нужно исправить сравнение, как я должен его исправить?

18.10.2019

  • Помогает ли это stackoverflow.com/a/55499502/1187415? – А как вопрос связан с [р]? 18.10.2019
  • Я добавил его, потому что в предупреждении была буква R. И я просмотрел вашу ссылку, но не знаю, как изменить свой код... Я мало что знаю о Swift. Не могли бы вы помочь мне @MartinR ?? 18.10.2019
  • Тег r предназначен для вопросов о R, «бесплатная программная среда для статистических вычислений и графики». 18.10.2019
  • О, @MartinR, я не знал, отличается ли он от этого. Мне жаль. 18.10.2019
  • @MartinR Как я могу удалить свое предупреждение? Мне нужна ваша помощь. 18.10.2019
  • stackoverflow.com/a/58008707/1187415 должен ответить на ваш вопрос: замените saltBytes на saltBytes.bindMemory(to: UInt8.self).baseAddress и аналогично для derivedKeyBytes. 18.10.2019
  • @MartinR Спасибо. Предупреждение снято. Я заполню свой измененный код в ответе. Пожалуйста, проверьте правильность. 18.10.2019
  • @MartinR Я опубликовал свой ответ. Пожалуйста, посмотрите, правильно ли я изменил его. Еще раз спасибо за вашу помощь. 18.10.2019

Ответы:


1

Я решил эту проблему с помощью @MartinR. Это ссылка, предложенная @MartinR в качестве ответа.

Замените saltBytes на saltBytes.bindMemory(to: UInt8.self).baseAddress и аналогично для derivedKeyBytes.

Успешный код с отсутствием всех предупреждений

func pbkdf2(hash: CCPBKDFAlgorithm, password: String, salt: Data, keyByteCount: Int, round: Int) -> Data? {
    let passwordData = password.data(using: .utf8)!
    let derivedKeyData = Data(count: keyByteCount)
    var localVariables = derivedKeyData
    let derivationStatus = localVariables.withUnsafeMutableBytes { derivedKeyBytes  in
      salt.withUnsafeBytes { saltBytes in

       CCKeyDerivationPBKDF(CCPBKDFAlgorithm(kCCPBKDF2),
                          password, passwordData.count, saltBytes.bindMemory(to: UInt8.self).baseAddress, salt.count,
                          hash, UInt32(round),
                          derivedKeyBytes.bindMemory(to: UInt8.self).baseAddress , derivedKeyData.count)
            }
        }

        if (derivationStatus != 0) {
                 Log.Error("\(derivationStatus)")
                 return nil;
        }

        return localVariables
    }
18.10.2019
  • @MartinR эм.... У меня есть еще один вопрос. UInt8 колеблется от 0 до 255. Думаю, это очень маленький диапазон. Менее вероятно, что UInt8 имеет повторяющиеся значения? 18.10.2019
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..