【发布时间】:2011-03-19 20:26:24
【问题描述】:
这是为了有一个漂亮的短 URL,它引用数据库中的 md5 哈希。我想转换这样的东西:
a7d2cd9e0e09bebb6a520af48205ced1
变成这样:
hW9lM5f27
两者包含的信息量大致相同。该方法不必是直接和可逆的,但这会很好(更灵活)。至少我想要一个随机生成的字符串,以十六进制哈希作为种子,因此它是可重现的。我相信有很多可能的答案,我很想知道人们会如何以优雅的方式做到这一点。
哦,这不必与原始哈希具有完美的 1:1 对应关系,但这将是一个好处(我想我已经暗示了可逆性标准)。如果可能的话,我想避免碰撞。
编辑 我意识到我最初的计算是完全错误的(感谢在这里回答的人,但我花了一段时间才弄清楚)并且你不能通过将所有小写和大写字母放入混合中来真正减少字符串长度。所以我想我会想要一些不直接从十六进制转换为基数 62 的东西。
【问题讨论】:
-
使用 base-64 编码,您只能将输入减少到 (4/8)/(6/8) -> 4/6 ~ 66%(这是假设您在不添加任何新内容的情况下处理“丑陋”的 base64 字符)。我可能会考虑使用(辅助)查找方法来获得真正“漂亮”的值。
-
Re “所以我想我会想要一些不直接从十六进制转换为基数 62 的东西。” -- 如果你想在一个 URL 安全的字符串中编码 16 个字节,我下面的答案(22 个字符)可能是你能得到的最好的答案。你到底想达到什么目的?