【问题标题】:Hashing and encoding sequence散列和编码序列
【发布时间】:2022-12-07 11:13:26
【问题描述】:
我正在研究生成类似 TinyURL 服务的高级设计,来自here。
作者发表声明:
“要生成唯一的短 URL,我们可以使用原始 URL 的唯一哈希值(MD5、SHA256 等)对其进行计算,然后使用 base62 进行编码。”
我理解散列和编码的一般含义,但我不理解顺序 - 首先散列,然后编码。遵循此命令背后的原因是什么?它总是保持不变吗?为什么不反过来——先编码再散列?
谢谢!
编辑:我想澄清一下,所有在线资源(我可以动手)都遵循相同的顺序。
【问题讨论】:
标签:
algorithm
encoding
hash
system-design
【解决方案1】:
散列与编码正在完成两件不同的事情。
Hashing 将采用任意(可能很长)的字符串,并发出固定大小(通常很短)的字节堆。映射通常是不可逆的并且映射看起来是随机的,但相同的输入将始终映射到相同的输出。我们通常希望避免许多常见输入映射到相同输出的情况——例如,如果我将每个输入字符串映射到“hello”,那么这在技术上是一个哈希函数,但它也完全没有用。这就是所谓的想要避免“散列冲突”,流行的散列函数(包括 MD5 和 SHA256)在这方面做得很好。
编码层要简单得多。 Base62 encoding 只是意味着获取一堆字节数据并使用字母数字字符(A-Z、a-z 和 0-9)重写它。输出大小将近似为输入大小的常数倍,并且该过程是完全可逆的。如果你想将一些任意数据变成一个有效的 URL,这很有用,否则很多字节是不可打印的或不是legal in URLs。
如果您散列然后编码,您将去:(初始 URL)-->(不可打印的短表示)-->(使用 URL 合法字符的短表示)。有用!
如果您先编码然后散列,您将去:(初始 URL)-->(仍然使用 URL 合法字符的相似长度表示)-->(不可打印的短表示)。这次我们没有达到我们想要的结果(最终结果不可打印)而且第一步也有点毫无意义。