我需要在python中生成一个uuid
。
我要与之交互的应用程序使用22个字符的uuids
。
这些似乎是通过生成char-32
uuid并对其进行base64编码而生成的。
现在,如果我尝试在python中执行此操作,那么我的(以base64编码的)uuid
总是有24个字符。
目前,我只是在22个字符之后“切断”编码后的uuid
。
不确定这是否有效。我很可能会以这种方式得到副本。
在生成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
答案 0 :(得分:0)
您确定这是该代码的输出吗?似乎不是,第一个字符串有22个字节(不是24个字节),第二个字符串没有终止引号。反正...
我不知道22字节压缩UUID的实现,但是基于base64编码的工作原理,如果确实使用了该编码,我会说是的,您只需删除最后两个字符即可。
当输入为16字节时,最后两个base64字符将始终为两个填充字符==,因为base64当时编码3个字节(15 in产生20 out),剩下一个需要填充的单独输入字节。解码器有时需要填充,但有时会忽略它们,因为它们可以计算出来,并且不包含任何实际数据。
但是,就像有人说的那样,最常见的base64字符集中没有使用“}”,URLsafe中也没有使用“}”。通常只是最后两个字符有所不同,通常它们是+ /或urlsafe -_,但是您的实现似乎使用了{等。大胆的猜测是}或|但是除非您可以找到目标应用程序的规范,否则您将不得不浏览现有的压缩uuid,以查看是否在A-Za-z0-9字符之外找到另一个字符。