ios - 如何使用 swift 3 在 iOS 上散列文件?

标签 ios swift hash commoncrypto

我有许多文件将保存在服务器上。用户可以在设备上创建这些类型的文件(plist),然后将其上传到所述服务器(CloudKit)。我想通过内容来区分它们(独特的方法应该能够适应创建日期的变化)。我的理解是我应该对这些文件进行哈希处理以获得它们的唯一文件名。我的问题是:

  1. 我的理解是否正确,我想要的是哈希函数?
  2. 我应该使用哪个函数(来自 CommonCrypto)。
  3. 我需要的是摘要?
  4. 我将如何在代码中处理它? (我假设这应该在 NSData 实例上散列?)。通过谷歌搜索我的理解是我需要一个桥接头包含但除此之外使用 CommonCrypto 让我感到困惑。如果有更简单的方法使用第一方 API(Apple),我会洗耳恭听(我想尽可能避免使用第三方代码)。

非常感谢!

最佳答案

为每个文件创建一个加密散列,您可以将其用于唯一性比较。 SHA-256 是当前的哈希函数,在使用 Common Crypto 的 iOS 上速度非常快,在 iPhone 6S 上 SHA256 将处理大约 1GB/秒减去 I/O 时间。如果您需要更少的字节,只需截断哈希即可。

使用 Common Crypto (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)")

Output:
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())")

Output:
testData: 74657374537472696e67
testHash: 4acf0b39d9c4766709a3689f553ac01ab550545ffa4544dfc0b2cea82fba02a3

另请参阅 Martin 的链接。

关于ios - 如何使用 swift 3 在 iOS 上散列文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42934154/

相关文章:

java - FileChannel ByteBuffer 和哈希文件

php - 如何转换 torrent 信息哈希以进行抓取?

mysql - hMailServer密码哈希

ios - MK坐标跨度制作: why specify longitude AND latitude delta?

ios - 从 AppDelegate 访问在 Storyboard 的 TableView 中创建的 View ?

Swift:如何为 Alamofire 使用同步线程?

Swift 2.0 - 从 firebase 获取用户详细信息

android - PWA OAuth 登录

ios - PubNub iOS WebRTC 集成

iOS 13 - UISegmentedControl - 如何更改 selectedSegment 的角半径?