uuid = UUID(uuidString: String) 创建大写字母

问题描述 投票:0回答:1

我的函数 UUID(uuidString: String) 有问题。将 UUID 作为带有小写字母的字符串传递,上述函数会生成带有大写字母的 UUID。谁能给我提示一下是什么原因造成的。

使用案例: 服务器:带有 Vapor 4 和 Postgres DB 的数据库服务器。存储应该是特定于用户的 客户端:带有登录过程的 iOS,服务器响应 UserID 和 token,两者都通过密钥存储在 UserDefaults.standard 中。 URL 是使用 UserID 动态生成的,并作为 HTTP 请求发送到服务器。
服务器检查以这种方式传递的 UserID,但无法识别它,因为 Postgres DB 使用小写字母创建和存储 UUID。但客户端生成的URL中包含了登录用户对应的大写UUID。

ios uuid vapor
1个回答
0
投票

从技术上讲,

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与案例无关的比较。

© www.soinside.com 2019 - 2024. All rights reserved.