在最少的字符中生成URL安全的UUID

20
理想情况下,我希望得到类似 example.com/resources/äFg4вNгё5 这样的东西,最少数量的可见字符,不用考虑在通过HTTP传输之前必须将它们进行百分号编码。

您能否提供一种方案,可以高效地将128位UUID编码为最少数量的可见字符,且结果中没有会破坏URL的字符?

2
国际字符仍然是一个棘手的问题;它可能在浏览器中一直工作,但如果您在不同的应用程序中复制粘贴,例如邮件客户端、即时通讯工具或者最脆弱的情况——短信,它们会出现错误。正如答案所建议的,Base64仍然是最好的方法,除非您做出危险的假设,认为用户不会在同一网络浏览器之外使用这些链接。 - Liz Av
2个回答

24

Base-64对此很好。

{098ef7bc-a96c-43a9-927a-912fc7471ba2}

可以编码为

vPeOCWypqUOSepEvx0cbog

通常在结尾处的等号可以省略,因为它们总是使字符串长度成为4的倍数。而且,你可以使用一些安全字符代替+/。你可以从中选择两个:- . _ ~

更多信息:


5
我使用一个url安全的base64字符串。以下是一些Python代码*
最后一行删除了“=”或“==”符号,这是base64编码喜欢放在末尾的,它们使把字符放入URL更加困难,只有在解码信息时才是必要的,而这里不需要解码信息。
import base64
import uuid

# get a UUID - URL safe, Base64
def get_a_Uuid():
    r_uuid = base64.urlsafe_b64encode(uuid.uuid4().bytes)
    return r_uuid.replace('=', '')

上述方法不适用于Python3。我现在采用的方法是:
 r_uuid = base64.urlsafe_b64encode(uuid.uuid4().bytes).decode("utf-8")
 return r_uuid.replace('=', '')

* 这个遵循标准:base64.urlsafe_b64encode 遵循 RFC 3548 和 4648,参见 https://docs.python.org/2/library/base64.html。已知长度的 base64 编码数据中剥离 == 是允许的,参见 RFC 4648 §3.2。UUID/GUID 在 RFC 4122 中指定;§4.1 格式 指出“UUID 格式为 16 个八位组”。base64 函数将这 16 个八位组进行编码。


3
无法在Python3中使用,应使用以下代码代替:return base64.urlsafe_b64encode(uuid.uuid4().bytes).strip("=")(该代码可在Python2中使用,并返回Unicode字符串)。 - Jocelyn delalande
你是将URL安全的UUID保存为模型的UUID,还是根据需要来回转换? - user9152964
1
@ReducedGosling 我保存了URL安全的版本。 - Chris Dutrow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接