将 UUID 32 个字符的十六进制字符串转换为“YouTube 样式”短 ID 并返回

新手上路,请多包涵

我正在使用 uuid.uuid1() 为我所有的 MongoDB 文档分配一个 GUID。我想要一种方法可以派生一个 11 个字符、唯一、区分大小写的类似 YouTube 的 ID,例如

1_XmY09uRJ4

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

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

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

原文由 zakdances 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 807
2 个回答

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

You probably want to use the base64.urlsafe_b64encode() function to avoid using / and + ( _ and - are used相反),因此生成的字符串可以用作 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 可能存储在数据库中以便于查找并且基于较小的值;例如,如果该值也是一个 URL 安全的 base64 字符串,那么它们将编码一个 8 字节的数字。

原文由 Martijn Pieters 发布,翻译遵循 CC BY-SA 4.0 许可协议

对于那些专门寻找以 url 安全方式缩短 uuid 的方法的人,可以使用 base64 模块来简化 @MartijnPieters 的真正有用的答案,以处理类似于评论的 url 不安全的字符来自 @okoboko 的回答(没有一些不必要的部分)。

 import base64
import uuid

# uuid to b64 string and back
uuid_to_b64str = base64.urlsafe_b64encode(uuid.uuid1().bytes).decode('utf8').rstrip('=\n')
b64str_to_uuid = uuid.UUID(bytes=base64.urlsafe_b64decode(f'{uuid_to_b64str}=='))

# uuid string to b64 string and back
uuidstr_to_b64str = base64.urlsafe_b64encode(uuid.UUID(str(uuid.uuid1())).bytes).decode('utf8').rstrip('=\n')
b64str_to_uuidstr = str(uuid.UUID(bytes=base64.urlsafe_b64decode(f'{uuidstr_to_b64str}==')))

原文由 benvc 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题