微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我有许多文件将存在于服务器上.用户可以在设备上创建这些类型的文件(plist),然后将其上传到所述服务器(CloudKit).我想通过内容使它们独一无二(唯一的方法应该适应创建日期的变化).我的理解是我应该散列这些文件获取它们的唯一文件名.我的问题是:

>我的理解是正确的,我想要的是哈希函数吗?
>我应该使用哪种功能(来自CommonCrypto).
>我需要的是摘要
>我将如何在代码中进行操作? (我假设这应该在NSData实例上进行哈希处理?).我从谷歌搜索的理解是,我需要一个桥接头,但除此之外,使用CommonCrypto困扰我.如果使用第一方API(Apple)有一种更简单的方法,我很满意(我希望尽可能避免使用第三方代码).

非常感谢!

创建每个文件的加密哈希值,您可以将其用于唯一性比较. SHA-256是一个当前的哈希函数,在iOS上使用Common Crypto非常快,在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的链接.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐