創建每個文件的加密散列,您可以將其用於唯一性比較。 SHA-256是目前的散列函數,在iOS上使用Common Crypto的速度相當快,在iPhone 6S上,SHA256將處理大約1GB /秒的時間減去I/O時間。如果你需要更少的字節只是截斷散列。
使用普通的加密(Swift3)
對於散列的字符串的一個例子:
func sha256(string: String) -> Data {
let messageData = string.data(using:String.Encoding.utf8)!
var digestData = Data(count: Int(CC_SHA256_DIGEST_LENGTH))
_ = digestData.withUnsafeMutableBytes {digestBytes in
messageData.withUnsafeBytes {messageBytes in
CC_SHA256(messageBytes, CC_LONG(messageData.count), digestBytes)
}
}
return digestData
}
let testString = "testString"
let testHash = sha256(string:testString)
print("testHash: \(testHash.map { String(format: "%02hhx", $0) }.joined())")
let testHashBase64 = testHash.base64EncodedString()
print("testHashBase64: \(testHashBase64)")
輸出:
testHash:4acf0b39d9c4766709a3689f553ac01ab550545ffa4544dfc0b2cea82fba02a3
testHashBase64:Ss8LOdnEdmcJo2ifVTrAGrVQVF/6RUTfwLLOqC + 6AqM =
注意:添加到您的橋接報:
#import <CommonCrypto/CommonCrypto.h>
對於散列數據:
func sha256(data: Data) -> Data {
var digestData = Data(count: Int(CC_SHA256_DIGEST_LENGTH))
_ = digestData.withUnsafeMutableBytes {digestBytes in
data.withUnsafeBytes {messageBytes in
CC_SHA256(messageBytes, CC_LONG(data.count), digestBytes)
}
}
return digestData
}
let testData: Data = "testString".data(using: .utf8)!
print("testData: \(testData.map { String(format: "%02hhx", $0) }.joined())")
let testHash = sha256(data:testData)
print("testHash: \(testHash.map { String(format: "%02hhx", $0) }.joined())")
輸出:
TESTDATA:74657374537472696e67
testHash:4acf0b39d9c4766709a3689f553ac01ab550545ffa4544dfc0b2cea82fba02a3
也看到馬丁的鏈接。
這裏的各種哈希方法:http://stackoverflow.com/questions/25388747/sha256-in-swift。 –
大警告。散列函數不會生成唯一的標識符。碰撞是可能的,你應該處理它。 – Sulthan
@Sulthan雖然這是真的,但密碼哈希可以安全地用於識別文件,請參閱Git。 – zaph