如何使用URL安全字符“压缩”一个32位十六进制UUID?

3
我希望缩短数据库条目的UUID,以便将其作为永久链接与他人分享。虽然我们可以有一个单独的缓存表来存储这些“指针”,但我想知道是否有更好的方法?我能想到的最好的方法是使用base64编码而不是十六进制编码。这将把它们从32个字符缩短到大约22个字符。但如果可能的话,我想将其缩短至14个字符以下。 :/
1个回答

1
我将尝试进行一些快速的数学计算,如果有错误,请纠正我。UUID在其最基本的级别上是一个128位的值(ref)。这意味着有2^128种可能性。
根据RFC 3986

在URI中允许但没有保留目的的字符称为未保留字符。这些包括大写和小写字母、十进制数字、连字符、句点、下划线和波浪号。

所以在URL中,我们可以使用大约66个未保留ASCII字符(26+26+10+4)。
解决方程 2^128 - 66^x = 0,其中 x 约为 21.18。这意味着,像您使用 base64 的想法一样,至少需要 22 个未保留的 ASCII 字符来对 UUID 进行 URL 编码(目前),而较少的字符不能始终使用。尽管在表面上(在浏览器中),可以使用 Unicode 字符来表示更大部分的十六进制数字(例如 example.com/uuid/☂☎♞ʤ☯...),但底层 URL 将比允许的 32 位十六进制数字长得多,因为 RFC 限制了 URL 字符。然而,这显然是疯狂的,并且需要一些精美的算法来对 UUID 进行编码。

对的,所以base64会使用A-Z和0-9的大小写组合,但不包括句点、连字符或下划线/波浪符号。因此,我想知道添加这些字符会有多大的差异。正如你所说,URL也支持Unicode字符,但它们不容易输入。 - Ben Guild
当将Unicode粘贴到地址栏时,浏览器会静默解码。这只是一种视觉效果。Base64可能是最好/最紧凑的编码方式,并且非常常见。请注意,base64字符串可能会附加=或==以使其长度为24个字符。 - Drakes

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