Hash Google URL缩短器如何生成5位数的哈希而不发生冲突

Hash Google URL缩短器如何生成5位数的哈希而不发生冲突,hash,url-shortener,goo.gl,Hash,Url Shortener,Goo.gl,Google URL缩写器如何生成一个包含五个字符的唯一的散列而不发生冲突。似乎一定会有冲突,不同的URL会生成相同的哈希 stackoverflow.com => http://goo.gl/LQysz 同样有趣的是,相同的URL每次生成完全不同的哈希: stackoverflow.com => http://goo.gl/Dl7sz 所以,做一些数学运算,使用小写、大写和数字,组合的总数是62^5=916132832显然冲突肯定会发生 谷歌是如何做到这一点的?他们有一个数据库

Google URL缩写器如何生成一个包含五个字符的唯一的散列而不发生冲突。似乎一定会有冲突,不同的URL会生成相同的哈希

stackoverflow.com => http://goo.gl/LQysz
同样有趣的是,相同的URL每次生成完全不同的哈希:

stackoverflow.com => http://goo.gl/Dl7sz
所以,做一些数学运算,使用小写、大写和数字,组合的总数是62^5=
916132832
显然冲突肯定会发生


谷歌是如何做到这一点的?

他们有一个数据库,可以跟踪所有以前生成的URL以及每个URL映射到的较长URL。很容易确保新生成的URL在该表中不存在。扩展起来有点棘手(他们肯定有多台服务器,因此需要为每台服务器分配一个值,从中可以向用户分发)。如果他们已经生成了916132832个URL,他们只需要添加另一个字符

  • 它跟踪以前使用的长URL。这意味着,当有人去创建一个短URL时,如果他们指向的地方已经有一个短URL,那么它只会给他们预先存在的短URL

  • 事实上,如果有一个系统专门基于给定的数据集创建“哈希”,那么效率会很低。相反,短URL只是一组随机字符,已被识别为十位数字,加上26个小写字母,再加上26个大写字母=916132832排列(不是组合)。随机短URL是最有效的工作方式,这就是为什么它们总是不同的原因(虽然我认为算法中可能还有其他成分,比如一天中的时间,但我认为这不值得……把它弄得这么复杂没有任何意义;把所有的处理能力都花在制作一个愚蠢的5个字符的字符串上,任何猴子都可以通过在排列计算器上按正确的按钮来完成)


  • 他们有一个哈希表,哈希到url

    计算该表中的行数,并使用流密码对其进行加密,然后使用base62进行编码


    使用流密码而不是散列将为您提供一个简短的伪随机输出,该输出不会与以前的任何输出冲突,因此您无需检查表。

    它可能会跟踪以前生成的路径。因此,您说散列基本上只是一个随机字符/数字生成器,它会检查数据库是否存在该散列已经创建。如果是这样,只需尝试生成另一个随机字符/数字哈希。似乎效率非常低。对于那些想知道的人来说。62^5=916132832