2017-06-16 40 views
0

我有一些代码从文件数据生成MD5字符串:测试我的MD5斯威夫特3码

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() 
    } 
} 

我不知道这是工作,因为它可能仅仅是MD5的字符串,我从得到Vimeo是错误的。

首先,Swift 3代码看起来是否可以生成MD5?使用方法:

let fileHandle = try? FileHandle(forReadingFrom: getFileUrl(forFileId: id)!) 
let fileData = fileHandle?.availableData 
if let md5 = fileData?.MD5().hexString() { ... } 

其次,是否有一个Web工具可用于上传我的文件并获取其MD5字符串?

更新:我测试了我在网上MD5工具文件,我得到以下散列:F0750875A790471702E9D2D34433729A 但我的代码产生这样的:f075875a79047172e9d2d34433729a

似乎如此接近!它必须是我的扩展中的某些东西。 Swift 3中有更好的MD5解决方案吗?

+0

我找到了一个web工具:http://onlinemd5.com –

回答

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哈希字符串。你也可以像这样在字符串扩展上使用它:

extension String { 

func MD5() -> String { 
    return self.data(using: .utf8)!.md5String 
} 
}