我的函数 UUID(uuidString: String) 有问题。将 UUID 作为带有小写字母的字符串传递,上述函数会生成带有大写字母的 UUID。谁能给我提示一下是什么原因造成的。
使用案例:
服务器:带有 Vapor 4 和 Postgres DB 的数据库服务器。存储应该是特定于用户的
客户端:带有登录过程的 iOS,服务器响应 UserID 和 token,两者都通过密钥存储在 UserDefaults.standard 中。
URL 是使用 UserID 动态生成的,并作为 HTTP 请求发送到服务器。
服务器检查以这种方式传递的 UserID,但无法识别它,因为 Postgres DB 使用小写字母创建和存储 UUID。但客户端生成的URL中包含了登录用户对应的大写UUID。
从技术上讲,
uuid = UUID(uuidString: String)
创建一个UUID对象,其内部表示为16个UInt8
字节,与大小写无关:
let uuid1 = UUID(uuidString: "9E9BF10C-06E2-4200-AE1A-B15F7960EEAF")!
print(uuid1.uuid)
// (158, 155, 241, 12, 6, 226, 66, 0, 174, 26, 177, 95, 121, 96, 238, 175)
let uuid2 = UUID(uuidString: "9e9bf10c-06e2-4200-ae1a-b15f7960eeaf")!
print(uuid2.uuid)
// (158, 155, 241, 12, 6, 226, 66, 0, 174, 26, 177, 95, 121, 96, 238, 175)
一个复杂的因素是 Swift 实现
.uuidString
返回大写表示。 (继承自 Apple 的 NSUUID
,它有很多遗留用途。)然而,许多其他项目遵循 RFC 4122 第 3 节“命名空间注册模板” 指导:
在我的用例中,我用UUID 的内部表示是一个特定的 内存中的位序列...
十六进制值“a”到“f”是 输出为小写字符 并且输入时不区分大小写。
UUID
扩展了 Swift
.rfc4122String
,以表达标准合规性意图的方式提供小写的 uuid 字符串。
public extension UUID {
/// lowercased string per RFC 4122 section 3 guidelines
var rfc4122String: String {
return self.uuidString.lowercased()
}
}
此外,如果存在大小写不明确的 UUID 字符串,则转换为 UUID
对象将 (1) 通过
init()
不返回
nil
来验证 uuid 字符串,并且 (2) 允许 UUID 到 UUID与案例无关的比较。