我有一些代码可以从文件数据生成MD5字符串:
extension Data {
func hexString() -> String {
let string = self.map{ String($0, radix:16) }.joined()
// "45769ca7ec1ac00cec11df87df982b7d"
return string
}
func MD5() -> Data {
var result = Data(count: Int(CC_MD5_DIGEST_LENGTH))
_ = result.withUnsafeMutableBytes {resultPtr in
self.withUnsafeBytes {(bytes: UnsafePointer<UInt8>) in
CC_MD5(bytes, CC_LONG(count), resultPtr)
}
}
return result
}
}
extension String {
func hexString() -> String {
return self.data(using: .utf8)!.hexString()
}
func MD5() -> String {
return self.data(using: .utf8)!.MD5().hexString()
}
}
我不确定这是否有效,因为它可能只是我从Vimeo获得的MD5字符串是错误的。
首先,Swift 3代码是否可以生成MD5?用法:
let fileHandle = try? FileHandle(forReadingFrom: getFileUrl(forFileId: id)!)
let fileData = fileHandle?.availableData
if let md5 = fileData?.MD5().hexString() { ... }
其次,是否有一个可用于上传文件并获取其MD5字符串的Web工具?
更新:我在在线MD5工具中测试了我的文件,得到以下哈希:F0750875A790471702E9D2D34433729A
但我的代码产生了这个:f075875a79047172e9d2d34433729a
看起来如此接近!它必须是我的扩展中的东西。在Swift 3中有更好的MD5解决方案吗?
答案 0 :(得分:0)
确定。我找到了一个很好的解决方案:
extension Data {
var md5String:String {
var digest = [UInt8](repeating: 0, count: Int(CC_MD5_DIGEST_LENGTH))
var digestHex = ""
self.withUnsafeBytes { (bytes: UnsafePointer<CChar>) -> Void in
CC_MD5(bytes, CC_LONG(self.count), &digest)
for index in 0..<Int(CC_MD5_DIGEST_LENGTH) {
digestHex += String(format: "%02x", digest[index])
}
}
return digestHex
}
}
这是数据扩展上的计算变量。我测试了这个,它产生了正确的MD5哈希字符串。您也可以在String扩展上使用它,如下所示:
extension String {
func MD5() -> String {
return self.data(using: .utf8)!.md5String
}
}