我正在使用 uuid.uuid1() 为我所有的 MongoDB 文档分配一个 GUID。我想要一种方法可以派生一个 11 个字符、唯一、区分大小写的类似 YouTube 的 ID,例如
1_XmY09uRJ4
来自 uuid 的十六进制字符串,看起来像
ae0a0c98-f1e5-11e1-9t2b-1231381dac60
我希望能够动态地将缩短的 ID 与十六进制匹配,反之亦然,而不必在数据库中存储另一个字符串。有没有人有一些示例代码或者可以指出可以执行此操作的模块或公式的方向?
原文由 zakdances 发布,翻译遵循 CC BY-SA 4.0 许可协议
将底层字节转换为 base64 值,去除
=
填充和换行符。You probably want to use the
base64.urlsafe_b64encode()
function to avoid using/
and+
(_
and-
are used相反),因此生成的字符串可以用作 URL 路径元素:相反:
将其转换为通用函数:
这为您提供了一种以更紧凑的形式表示 16 字节 UUID 的方法。进一步压缩会丢失信息,这意味着您无法将其再次解压缩为完整的 UUID。 16 个字节可以表示的全部值范围永远不会适合少于 22 个 base64 字符,每三个字节的输入需要 4 个字符,每个字符编码 6 位信息。
YouTube 的唯一字符串因此不是基于完整的 16 字节 UUID,它们的 11 个字符 ID 可能存储在数据库中以便于查找并且基于较小的值;例如,如果该值也是一个 URL 安全的 base64 字符串,那么它们将编码一个 8 字节的数字。