小编典典

将UUID 32个字符的十六进制字符串转换为“ YouTube风格”的简短ID,然后返回

python

我正在使用uuid.uuid1()为我的所有MongoDB文档分配一个GUID。我想要一种导出11个字符的唯一,区分大小写的类YouTubeID的方法,例如

1_XmY09uRJ4

来自uuid的十六进制字符串,看起来像

ae0a0c98-f1e5-11e1-9t2b-1231381dac60

我希望能够将缩短的ID动态匹配到十六进制,反之亦然,而不必在数据库中存储另一个字符串。有没有人有一些示例代码,或者可以指出我可以执行此操作的模块或公式的方向?


阅读 220

收藏
2020-12-20

共1个答案

小编典典

将基础字节转换为base64值,去除=填充和换行符。

您可能希望使用该base64.urlsafe_b64encode()函数来避免使用/and
+_和和-代替),因此所得的字符串可以用作URL路径元素:

>>> import uuid, base64
>>> base64.urlsafe_b64encode(uuid.uuid1().bytes).rstrip(b'=').decode('ascii')
'81CMD_bOEeGbPwAjMtYnhg'

相反:

>>> uuid.UUID(bytes=base64.urlsafe_b64decode('81CMD_bOEeGbPwAjMtYnhg' + '=='))
UUID('f3508c0f-f6ce-11e1-9b3f-002332d62786')

要将其转换为通用函数:

from base64 import urlsafe_b64decode, urlsafe_b64encode
from uuid import UUID

def uuid2slug(uuidstring):
    return urlsafe_b64encode(UUID(uuidstring).bytes).rstrip(b'=').decode('ascii')

def slug2uuid(slug):
    return str(UUID(bytes=urlsafe_b64decode(slug + '==')))

这为您提供了一种以更紧凑的形式表示16字节UUID的方法。进一步压缩会丢失信息,这意味着您无法再次将其解压缩为完整的UUID。16个字节可以表示的所有值的范围将永远不会适合22个base64字符以内的字符,每三个输入字节需要4个字符,每个字符编码6位信息。

因此,YouTube的唯一字符串不是基于完整的16字节UUID,它们的11个字符ID可能存储在数据库中以便于查找,并且基于较小的值。

2020-12-20