11

Google URL 缩短器如何生成具有五个字符的唯一哈希而不会发生冲突。似乎肯定会发生冲突,不同的 url 会生成相同的哈希。

stackoverflow.com => http://goo.gl/LQysz

同样有趣的是,同一个 URL,每次生成完全不同的哈希:

stackoverflow.com => http://goo.gl/Dl7sz

因此,做一些数学运算,使用小写字符、大写字符和数字,组合的总数为 62^5 =916,132,832显然肯定会发生冲突。

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

4

3 回答 3

8

他们有一个数据库,可以跟踪所有以前生成的 URL 以及每个映射到的较长 URL。很容易确保该表中不存在新生成的 URL。横向扩展有点棘手(他们肯定有多个服务器,因此需要为每个服务器分配一个可以分配给用户的值桶)。如果他们达到生成 916,132,832 个 URL 的程度,他们只会添加另一个字符。

于 2011-11-03T02:04:18.107 回答
1

他们有一个带有哈希到 url 的哈希表。

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

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

于 2019-10-24T15:35:25.320 回答
-2
  1. 它跟踪以前使用的长 URL。这意味着,当有人去创建一个短网址时,如果他们指向的地方已经有一个短网址,它只会给他们预先存在的短网址。

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

于 2011-12-09T20:21:08.690 回答