我正在阅读一个在线文档,其中解释了如何设计url缩短服务。该网站是https://www.educative.io/courses/grokking-the-system-design-interview。
[在对实际网址进行编码的部分中,他们说->“我们可以计算给定URL的唯一哈希(例如MD5或SHA256等)。然后可以对该哈希进行编码以进行显示。该编码可以是base36([az,0-9])或base62([AZ ,az,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的输出用作十六进制数字字符串,然后使用base64对该字符串进行编码。没有理由对字符串进行base64编码-base64编码用于二进制数据。您可能想做的是将MD5哈希的实际128位二进制值设置为base64。这是一些我认为您要尝试做的Python代码:
import hashlib, base64
text = "www.yahoo.com"
text_utf8 = text.encode('utf8')
md5 = hashlib.md5(text_utf8).digest()
b64 = base64.b64encode(md5)
print(b64)
这将得到结果GwNXftEE8WqtwApjnTPLRA
,它具有您期望的长度。