Rob*_*ier 12
执行此操作的官方方法是使用版本 5 UUID(RFC 4122 第 4.3 节):
4.3 创建基于名称的 UUID 的算法
版本 3 或 5 UUID 旨在从“名称”生成 UUID,这些“名称”取自某些“名称空间”,并且在某些“名称空间”中是唯一的。
该过程是对字符串进行哈希处理,然后将其插入到 UUID 中。我将仔细遵循这里的规范,但我会标记您可以忽略的部分,它仍然可以正常工作。
正如 Matt 指出的,如果您只需要哈希值,则可以直接使用 SHA。但如果您的系统确实需要 UUID,则可以这样做。
let namespace = "com.example.mygreatsystem:"
Run Code Online (Sandbox Code Playgroud)
let inputString = "arandomstring"
let fullString = namespace + inputString
Run Code Online (Sandbox Code Playgroud)
import CryptoKit
let hash = Insecure.SHA1.hash(data: Data(fullString.utf8)) // SHA-1 by spec
Run Code Online (Sandbox Code Playgroud)
或者
let hash = SHA256.hash(data: Data(fullString.utf8)) // SHA-2 is generally better
Run Code Online (Sandbox Code Playgroud)
var truncatedHash = Array(hash.prefix(16))
Run Code Online (Sandbox Code Playgroud)
truncatedHash[6] &= 0x0F // Clear version field
truncatedHash[6] |= 0x50 // Set version to 5
truncatedHash[8] &= 0x3F // Clear variant field
truncatedHash[8] |= 0x80 // Set variant to DCE 1.1
Run Code Online (Sandbox Code Playgroud)
let uuidString = NSUUID(uuidBytes: truncatedHash).uuidString
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6585 次 |
| 最近记录: |