生成 22 个字符的 uuid?

Generate 22-character uuid?

我需要在 python 中生成一个 uuid

我要与之交互的应用程序使用 22 个字符 uuids。 这些似乎是通过生成 char-32 uuid 并对它进行 base64 编码生成的。

现在,如果我尝试在 python 中这样做,我的(base64 编码)uuid 总是有 24 个字符。

目前我只是 "cut off" 编码后的 uuid 22 个字符。 不确定这是否有效。我很可能会以这种方式获得重复项。 我可能在生成我的 uuid 时犯了错误吗?

我的代码:

import uuid
import base64

my_uuid = new_occ_id = base64.urlsafe_b64encode(uuid.uuid4().bytes)
my_uuid_22 = new_occ_id = my_uuid[0:22]
print(my_uuid)
print(my_uuid_22)

...产量(!!更正输出!!):

b'1K-HAjUjEemzDxwbtRxjwA=='
b'1K-HAjUjEemzDxwbtRxjwA'

来自应用程序的示例 UUID

051MZjd97kcBgtZiEH}IvW

您确定这是该代码的输出吗?似乎不是,第一个字符串有 22 个字节(不是 24 个字节),第二个没有终止引号。无论如何...

我不知道 22 字节压缩 UUID 的实现,但是根据 base64 编码的工作原理,如果确实使用了,我会说是的,你可以简单地删除最后两个字符。

当输入为 16 字节时,最后两个 base64 字符将始终是两个填充字符 ==,因为当时 base64 正在编码 3 个字节(15 个输入产生 20 个输出),留下一个单独的输入字节需要填充。解码器有时需要填充,但有时会忽略它们,因为它们可以计算,并且不包含任何实际数据。

然而,正如有人所说,“}”没有用于最常见的 base64 字符集中,也没有用于 urlsafe 字符集中。通常只是最后两个字符不同,通常它们是 +/ 或在 urlsafe -_ 中,但您的实现似乎使用 { 等等。疯狂的猜测是 } 或 |但是您必须查看现有的压缩 uuid 以查看是否在 A-Za-z0-9 字符之外找到另一个字符,除非您可以找到目标应用程序的规范。