bis*_*was 3 algorithm hash system
我正在阅读一份在线文档,其中解释了如何设计 url 缩短服务。网站是https://www.eduative.io/courses/grokking-the-system-design-interview。
\n\n在“编码实际 URL”部分中,他们说 ->\n“我们可以计算给定 URL 的唯一哈希值(例如 MD5 或 SHA256 等)。然后可以对哈希值进行编码以供显示。此编码可以是 base36 ([az ,0-9]) 或 base62 ([AZ, az, 0-9]) 并且如果我们添加 \xe2\x80\x98+\xe2\x80\x99 和 \xe2\x80\x98/\xe2\x80 \x99 我们可以使用 Base64 编码。一个合理的问题是,短密钥的长度应该是多少?6、8 或 10 个字符。”
\n\n“如果我们使用MD5算法作为我们的哈希函数,它\xe2\x80\x99将产生一个128位的哈希值。经过base64编码后,我们\xe2\x80\x99将得到一个超过21个字符的字符串(因为每个base64字符编码哈希值的 6 位)。由于每个短密钥只有 8 个字符的空间,那么我们如何选择我们的密钥?我们可以取前 6 个(或 8 个)字母作为密钥。这可能会导致密钥重复,为了解决这个问题,我们可以从编码字符串中选择一些其他字符或交换一些字符。”
\n\n我使用在线MD5哈希生成器(http://onlinemd5.com/)和Base64编码器(https://www.base64encode.org/)来验证上述内容。我使用“www.yahoo.com”作为 MD5 哈希的输入字符串,输出为 1B03577ED104F16AADC00A639D33CB44 。然后我对其进行 Base64 编码并得到 MUIwMzU3N0VEMTA0RjE2QUFEQzAwQTYzOUQzM0NCNDQ= 以及 UTF-8 目标字符集和 Unix 换行符分隔符。
\n\n谁能解释一下我是否做得正确?我看到字符数远远超过 21 个。
\n问题是您使用 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)
Run Code Online (Sandbox Code Playgroud)
GwNXftEE8WqtwApjnTPLRA
这会得到具有您期望的长度的结果。
归档时间: |
|
查看次数: |
3799 次 |
最近记录: |