好的,所以你时不时会遇到在使用各种框架和库以及在互联网上找不到的东西之前已经解决的问题,并且你的问题得到了相对快速和容易的解决,并且你还了解了为什么你的问题是一个问题地方。
但是,有时您会遇到绝对 0 意义的问题,当解决方案具有负面意义时更糟。
我的问题是我想从中Data
提取并制作一个 MD5 散列。
我找到了各种解决方案,但没有一个有效。
实际上真正困扰我的是解决方案对于一项琐碎的任务似乎是多么不必要的复杂,因为从任何东西中获取 MD5 哈希。
我正在尝试使用Crypto
andCommonCrypto
框架Soffes
,它们看起来相当容易,对吧?正确的?
是的!
但为什么我仍然收到错误fatal error: unexpectedly found nil while unwrapping an Optional value
?
据我了解,在 bymyData.md5
的扩展中提供Crypto
的数据Soffes
似乎是“可选的”。但为什么?
我试图执行的代码是:
print(" md5 result: " + String(data: myData.md5, encoding: .utf8)!)
where myData
100% 有数据,因为在上面的代码行之后,我将该数据发送到服务器,并且数据存在。
最重要的是,打印myData.md5.count
by的计数print(String(myData.md5.count))
非常有效。
所以我的问题基本上是:我如何对数据进行 MD5 散列并将其打印为字符串?
编辑:
我试过的
这样可行
MD5:test
在 PHP 脚本中输入字符串给了我098f6bcd4621d373cade4e832627b4f6
,Swift 代码"test".md5()
也给了我098f6bcd4621d373cade4e832627b4f6
那行不通
将UInt8
字节数组 from转换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
测试 1、2 和 3 MD5:7f0a012239d9fde5a46071640d2d8c83
PHP MD5:06eb0c71d8839a4ac91ee42c129b8ba3
PHP代码:echo md5($_FILES["file"]["tmp_name"])