用于 URL 的 Guid 的最短编码
Posted
技术标签:
【中文标题】用于 URL 的 Guid 的最短编码【英文标题】:shortest encoding for Guid for use in a URL 【发布时间】:2010-11-19 17:16:11 【问题描述】:Mads Kristensen 降到 00amyWGct0y_ze4lIsj2Mw
可以再小一点吗?
【问题讨论】:
【参考方案1】:看起来只有 73 字符可以在 URL 中不转义地使用。如果是这种情况,您可以将 128 位数字转换为基数 73,并具有 21 个字符的 URL。
如果你能找到 85 个合法字符,你可以得到一个 20 个字符的 URL。
【讨论】:
所以我们要在 URL 上保存 9 个字符?我发现阅读/背诵十六进制实际上比 00amyWGct0y_ze4lIsj2Mw 更容易 @hometoast:是的,好吧,这似乎不是 OP 的限制条件。 ;) 我使用 Ascii85 编码以 20 个 ASCII 字符将 Guid 写入数据库列。我已经发布了 C# 代码以防它有用。 URL 编码的特定字符集可能不同,但您可以选择适合您的应用程序的任何字符。它可以在这里找到:***.com/questions/2827627/… 我不确定你从哪里得到 73 个数字——在 tools.ietf.org/html/rfc3986#section-2.3 中只有 66 个未保留的字符:'A-Z'、'a-z'、'0- 9'、'-'、'.'、'_' 和 '~'。其他 7 个字符是什么? @slacy:来自链接的页面;它列出了来自 RFC 1738 第 2.2 节的A-Za-z0-9
和 $-_.+!*'(),
。看起来您引用的 RFC 3986 更新了 RFC 1738。这 7 个字符 $+!*(),
出现在 RFC 3986 第 2.2 节中,作为子分隔符的保留字符。所以这 7 个字符来自 1994-2005 年,到 2005 年现在是 66 个字符。【参考方案2】:
GUID 看起来像这样 c9a646d3-9c61-4cb7-bfcd-ee2522c8f633 - 这是 32 个十六进制数字,每个编码 4 位,因此总共 128 位
base64 编码每个符号使用 6 位,这很容易使用 URL 安全字符来实现,以提供 22 字符编码的字符串。正如其他人所指出的,您可以使用 73 个 url 安全符号并编码为基数 73 数字以提供 21 个字符。
【讨论】:
您是如何得出“6 位来自 URL 安全字符”位的? 没有 127 个 URL 安全字符,因此假设最多 6 位。 6 位是base64,原始链接指向的。如果您可以获得超过 64 个字符,例如 85,您可以将 128 位数字转换为以 85 为底的数字并减少到 20 个字符。它只是不如 base64 好。 Base64 使用 6 位。不过,您必须替换 Base64 字符列表中的“/”。 @Dominic:Base64 = 实际数据每字节 6 位。以上是关于用于 URL 的 Guid 的最短编码的主要内容,如果未能解决你的问题,请参考以下文章