Хорошо, поэтому время от времени вы сталкиваетесь с проблемами, которые вы решили, прежде чем использовать различные фреймворки и библиотеки, а еще что-то не найти в Интернете, и ваша проблема решена относительно быстро и просто, и вы также узнаете, почему ваша проблема была проблемой в первое место.Почему так сильно хешируется MD5 и в Swift 3?
Однако иногда вы сталкиваетесь с проблемами, которые создают абсолютный смысл и даже хуже, когда решения имеют отрицательный смысл.
Моя проблема в том, что я хочу взять Data
и сделать из него хеш MD5.
Я нахожу все виды решений, но никто из них не работает.
Что на самом деле вызывает у меня на самом деле то, как неоправданно сложно решить эти проблемы для тривиальной задачи, как получение хэша MD5 из чего-либо.
Я пытаюсь использовать рамки Crypto
и CommonCrypto
на Soffes
, и они кажутся довольно простыми, не так ли? Правильно?
Да!
Но почему я все еще получаю ошибку fatal error: unexpectedly found nil while unwrapping an Optional value
?
Из того, что я понимаю, данные, предоставленные myData.md5
в расширении Crypto
, на Soffes
, по-видимому, являются «необязательными». Но почему?
код Я пытаюсь выполнить это:
print(" md5 result: " + String(data: myData.md5, encoding: .utf8)!)
где myData
имеет данные в нем на 100%, потому что после предыдущей строки кода, я посылаю, что данные на сервер, и данные существуют.
Кроме того, печать кол-ва myData.md5.count
по print(String(myData.md5.count))
работает отлично.
Итак, мой вопрос в основном: Как сделать MD5 хэш Data и напечатать его как строку?
Edit:
То, что я пытался
Это работает
MD5: ИНГ строку test
в PHP скрипт дает мне 098f6bcd4621d373cade4e832627b4f6
и Swift код "test".md5()
также дает мне 098f6bcd4621d373cade4e832627b4f6
Это не работает
Преобразование массива UInt8
байт из Data.md5()
в строку, которая представляет правильное значение MD5.
Различные тесты, которые я сделал следующие:
var hash = ""
for byte in myData.data.md5() {
hash += String(format: "%02x", byte)
}
print("loop = " + hash) //test 1
print("myData.md5().toHexString() = " + myData.md5().toHexString()) //test 2
print("CryptoSwift.Digest.md5([UInt8](myData)) = " + CryptoSwift.Digest.md5([UInt8](myData)).toHexString()) //test 3
Все три теста с тестовыми данными 500 байт дают мне значение MD5 56f6955d148ad6b6abbc9088b4ae334d
в то время как мой PHP скрипт дает мне 6081d190b3ec6de47a74d34f6316ac6b
Испытательный образец (64 байт): Исходные данные:
FFD8FFE0 00104A46 49460001 01010048 00480000 FFE13572 45786966 00004D4D
002A0000 0008000B 01060003 00000001 00020000 010F0002 00000012 00000092
Test 1, 2 и 3 MD5: 7f0a012239d9fde5a46071640d2d8c83
PHP MD5: 06eb0c71d8839a4ac91ee42c129b8ba3
PHP код: echo md5($_FILES["file"]["tmp_name"])
Вы говорите, что 'myData' и' myData.md5' являются действительными, когда вы получаете данные на сервере и счетчик в инструкции печати. Основываясь только на этих данных и глядя на вашу строку кода, единственное, что выделяется, - это кодировка 'utf8', которую вы использовали для преобразования в строку. – lukya
Найдено [этот вопрос SO] (http://stackoverflow.com/questions/24123518/how-to-use-cc-md5-method-in-swift-language), в котором упоминается, что функция 'CC_MD5', используемая в Crypto код не работает в Swift. Хотя это противоречит вашей точке зрения о том, что 'myData.md5' не имеет значения null. – lukya
Да, это очень странно. Я пытаюсь CryptoSwift прямо сейчас, и я получаю такую же ошибку. – vaid