如何最好地 "compress" 具有 URL 安全字符的 32 字符十六进制 UUID?
How to best "compress" a 32 character hexadecimal UUID with URL-safe characters?
我希望缩短数据库条目的 UUID,以使 URL 安全且可作为永久链接共享。虽然我们可以为字符较少的字符单独缓存 table of "pointers",但我想知道是否有更好的方法?
我能想到的最好的方法是 base64
对它们进行编码,而不是对它们进行十六进制编码。这将它们从 32 个字符缩短到大约 22 个字符。但如果可能的话,我想尝试将其减少到 14 个字符以下。 :/
我将在这里尝试一些快速数学运算,所以如果我错了请纠正我。 UUID 是最基本的 128 位值 (ref)。这意味着有 2^128 种可能性。
根据RFC 3986,
Characters that are allowed in a URI but do not have a reserved
purpose are called unreserved. These include uppercase and lowercase
letters, decimal digits, hyphen, period, underscore, and tilde.
所以在朋友之间,假设我们可以在 URL (26+26+10+4) 中使用大约 66 个未保留的 ASCII 字符。
求解equation 2^128 - 66^x = 0,x大约是21.18,这意味着,就像你用base64的想法说的那样,至少需要22个未保留的ASCII字符才能URL-编码 UUID(此时)并且 100% 的时间不能使用更少的字符。
话虽如此,在表面上(视觉上,在浏览器中)可能可以使用 unicode 字符来表示较大部分的十六进制(例如。com/uuid/☂☎♞ʤ☯... ),但底层 URL 将比 32 位十六进制 UUID 长得多,因为 URL 字符受 RFC 限制。然而,这无疑是疯狂的,需要一些巧妙的算法来很好地编码 UUID。
我希望缩短数据库条目的 UUID,以使 URL 安全且可作为永久链接共享。虽然我们可以为字符较少的字符单独缓存 table of "pointers",但我想知道是否有更好的方法?
我能想到的最好的方法是 base64
对它们进行编码,而不是对它们进行十六进制编码。这将它们从 32 个字符缩短到大约 22 个字符。但如果可能的话,我想尝试将其减少到 14 个字符以下。 :/
我将在这里尝试一些快速数学运算,所以如果我错了请纠正我。 UUID 是最基本的 128 位值 (ref)。这意味着有 2^128 种可能性。
根据RFC 3986,
Characters that are allowed in a URI but do not have a reserved purpose are called unreserved. These include uppercase and lowercase letters, decimal digits, hyphen, period, underscore, and tilde.
所以在朋友之间,假设我们可以在 URL (26+26+10+4) 中使用大约 66 个未保留的 ASCII 字符。
求解equation 2^128 - 66^x = 0,x大约是21.18,这意味着,就像你用base64的想法说的那样,至少需要22个未保留的ASCII字符才能URL-编码 UUID(此时)并且 100% 的时间不能使用更少的字符。
话虽如此,在表面上(视觉上,在浏览器中)可能可以使用 unicode 字符来表示较大部分的十六进制(例如。com/uuid/☂☎♞ʤ☯... ),但底层 URL 将比 32 位十六进制 UUID 长得多,因为 URL 字符受 RFC 限制。然而,这无疑是疯狂的,需要一些巧妙的算法来很好地编码 UUID。