在使用哈希编写缩短url服务时,我们是否应该担心冲突

在使用哈希编写缩短url服务时,我们是否应该担心冲突,url,math,url-shortener,Url,Math,Url Shortener,考虑使用简单的散列来创建一个内部使用的缩短url服务。我计划使用的函数如下所示 string s = base64Convert(md5(salt: time in million seconds)) string url = s.substring(0, len: 6) Map url to real url 将有64^6=68719476736个可能的组合。对于我们的内部服务来说应该足够了 然而有一件事让我担心,我如何确保在64^6+1次哈希之前不会有重复的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=68719476736个可能的组合。对于我们的内部服务来说应该足够了

然而有一件事让我担心,我如何确保在64^6+1次哈希之前不会有重复的url

有什么想法吗

如何确保在64^6+1次哈希之前不会有重复的url

使用简单的散列,无法确保此属性

假设md5的分布是相等的,若您对n个URL进行了哈希处理并添加了一个URL,那个么就有n个可能的结果如何冲突,646-n如何不冲突。所以新元素发生碰撞的几率是n/646。即使对于n=1,该值也不是零,因此第二个URL在理论上可能已经发生冲突,即使实际发生这种情况的可能性非常低。数据库中的非冲突URL越多,新哈希与任何现有哈希发生冲突的可能性就越高,直到n=646的可能性为100%

如果你这样想,一定要记住这一点。如果您有一组要添加的n个URL,那么其中任意两个URL发生冲突的几率要远远大于最后一个URL与之前添加的URL发生冲突的几率。如果您这样做,您会发现使用您的方案,您可以在任意两个URL之间发生冲突的几率超过1%之前,对大约37.000个URL进行哈希运算

因此,您现在必须决定1%的冲突概率是否可以接受,以及37.000个URL是否足以满足您的需要。如果概率结果不能满足您的要求,您可以调整机会,例如使用6位以上的数字,或者您必须执行

如何确保在64^6+1次哈希之前不会有重复的url

使用简单的散列,无法确保此属性

假设md5的分布是相等的,若您对n个URL进行了哈希处理并添加了一个URL,那个么就有n个可能的结果如何冲突,646-n如何不冲突。所以新元素发生碰撞的几率是n/646。即使对于n=1,该值也不是零,因此第二个URL在理论上可能已经发生冲突,即使实际发生这种情况的可能性非常低。数据库中的非冲突URL越多,新哈希与任何现有哈希发生冲突的可能性就越高,直到n=646的可能性为100%

如果你这样想,一定要记住这一点。如果您有一组要添加的n个URL,那么其中任意两个URL发生冲突的几率要远远大于最后一个URL与之前添加的URL发生冲突的几率。如果您这样做,您会发现使用您的方案,您可以在任意两个URL之间发生冲突的几率超过1%之前,对大约37.000个URL进行哈希运算

因此,您现在必须决定1%的冲突概率是否可以接受,以及37.000个URL是否足以满足您的需要。如果概率结果不能满足您的要求,您可以调整机会,例如使用6位以上的数字,或者您必须执行

如何确保在64^6+1次哈希之前不会有重复的url

使用简单的散列,无法确保此属性

假设md5的分布是相等的,若您对n个URL进行了哈希处理并添加了一个URL,那个么就有n个可能的结果如何冲突,646-n如何不冲突。所以新元素发生碰撞的几率是n/646。即使对于n=1,该值也不是零,因此第二个URL在理论上可能已经发生冲突,即使实际发生这种情况的可能性非常低。数据库中的非冲突URL越多,新哈希与任何现有哈希发生冲突的可能性就越高,直到n=646的可能性为100%

如果你这样想,一定要记住这一点。如果您有一组要添加的n个URL,那么其中任意两个URL发生冲突的几率要远远大于最后一个URL与之前添加的URL发生冲突的几率。如果您这样做,您会发现使用您的方案,您可以在任意两个URL之间发生冲突的几率超过1%之前,对大约37.000个URL进行哈希运算

因此,您现在必须决定1%的冲突概率是否可以接受,以及37.000个URL是否足以满足您的需要。如果概率结果不能满足您的要求,您可以调整机会,例如使用6位以上的数字,或者您必须执行

如何确保在64^6+1次哈希之前不会有重复的url

使用简单的散列,无法确保此属性

假设md5的分布是相等的,若您对n个URL进行了哈希处理并添加了一个URL,那个么就有n个可能的结果如何冲突,646-n如何不冲突。所以新元素发生碰撞的几率是n/646。即使对于n=1,该值也不是零,因此第二个URL在理论上可能已经发生冲突,即使实际发生这种情况的可能性非常低。数据库中的非冲突URL越多,新哈希与任何现有哈希发生冲突的可能性就越高,直到n=646的可能性为100%

如果你这样想,一定要记住这一点。如果您有一组要添加的n个URL,那么其中任意两个URL发生冲突的几率要远远大于最后一个URL与之前添加的URL发生冲突的几率。如果您这样做,您会发现使用您的方案,您可以在任意两个URL之间发生冲突的几率超过1%之前,对大约37.000个URL进行哈希运算

因此,您现在必须决定1%的冲突概率是否可以接受,以及37.000个URL是否可以接受