2015-10-20 67 views
0

想用简单的散列法来创建一个内部使用的缩短url服务。我打算使用的功能如下使用散列法编写缩短url服务时,我们应该担心冲突

string s = base64Convert(md5(salt: time in million seconds)) 
    string url = s.substring(0, len: 6) 

    Map url to real url 

会有64^6 = 68,719,476,736个可能的组合。对于我们的内部服务应该绰绰有余。

但是有一件事让我担心,我怎么才能确保在64^6 +1时间散列之前不会有重复的url?

有什么想法?

回答

3

我怎样才能确保不会有重复的网址,直到64^6 +1时间哈希?

使用简单散列法,您不能确保此属性。

假设MD5的等分布,如果你有ň的URL散列,并添加一个,然后有ň可能的结果会是如何碰撞和64 - ñ怎么会有冲突。因此,该新元素碰撞的机会是n/64 。即使n = 1,此值也不为零,因此第二个网址在理论上可能已经发生碰撞,即使实际发生的机会非常低。数据库中的非冲突URL越多,新哈希将与任何现有哈希冲突的机会就越高,直到机会变为100%为止,直到== 64 。

如果你这样想,请务必记住birthday “paradox”。如果你有一组n你想添加的网址,那么他们碰撞的任意两个的机会是方式大于最后一个与你之前添加的任何一个碰撞的机会。如果你使用do the math,你会发现使用你的方案,你可以期望在它们中任何两个之间发生碰撞的可能性超过1%之前,散列约37.000个URL。

因此,您现在必须决定是否有1%的碰撞概率是可以接受的,以及37.000个URL是否足以满足您的需求。如果概率结果不满足你,你可以通过例如调整机会来调整。使用6位以上的数字,否则您必须执行collision resolution

相关问题