【发布时间】:2020-01-11 06:48:49
【问题描述】:
我正在阅读一份在线文档,其中介绍了如何设计网址缩短服务。该网站是https://www.educative.io/courses/grokking-the-system-design-interview。
在编码实际 URL 部分中,他们说 -> “我们可以计算给定 URL 的唯一哈希(例如,MD5 或 SHA256 等)。然后可以对哈希进行编码以进行显示。这种编码可以是 base36 ([a-z ,0-9]) 或 base62 ([A-Z , a-z, 0-9]),如果我们添加 '+' 和 '/' 我们可以使用 Base64 编码。一个合理的问题是,短键的长度应该是多少?6、8 或 10 个字符。
"如果我们使用 MD5 算法作为我们的哈希函数,它会产生一个 128 位的哈希值。经过 base64 编码后,我们会得到一个超过 21 个字符的字符串(因为每个 base64 字符编码 6 位哈希值)。由于每个短键只有 8 个字符的空间,那么我们将如何选择我们的键呢?我们可以将前 6(或 8)个字母作为键。这可能导致键重复,以解决该问题,我们可以从编码字符串中选择一些其他字符或者交换一些字符。”
我使用在线 MD5 哈希生成器(http://onlinemd5.com/)和 Base64 编码器(https://www.base64encode.org/)来验证上述内容。我使用“www.yahoo.com”作为 MD5 哈希的输入字符串,输出为 1B03577ED104F16AADC00A639D33CB44 。然后我对它进行 Base64 编码并得到 MUIwMzU3N0VEMTA0RjE2QUFEQzAwQTYzOUQzM0NCNDQ= 与 UTF-8 目标字符集和 Unix 换行符分隔符。
谁能解释我是否正确执行?我看到字符数超过 21 个。
【问题讨论】:
-
MD5 哈希中的 32 个字符中的每个字符代表 4 位。因此,您需要将它们组合起来以创建 8 位值。例如第一个字节是十六进制 1B,即十进制 27。得到一个 16 字节的数组后,就可以对其进行 Base64 编码。
-
看完本教程-lifewire.com/base64-encoding-overview-1166412和下面的评论,我明白了。谢谢大家。