hash - 使用一个 64 位数字唯一标识 URL

标签 hash hash-collision birthday-paradox

这基本上是一个数学问题,但与编程非常相关:如果我有 10 亿个包含 URL 的字符串,并且我取每个字符串的 MD5 哈希值的前 64 位,我应该期望什么样的冲突频率?

如果我只有 1 亿个网址,答案会如何变化?

在我看来,碰撞是极其罕见的,但这些事情往往令人困惑。

使用 MD5 以外的其他东西会更好吗?请注意,我不是在寻找安全性,只是在寻找一个良好的快速哈希函数。此外,MySQL 的 native 支持也很好。

编辑:not quite a duplicate

最佳答案

如果 MD5 的前 64 位构成具有理想分布的哈希值,那么生日悖论仍然意味着每 2^32 个 URL 都会发生冲突。换句话说,冲突的概率是 URL 的数量除以 4,294,967,296。请参阅http://en.wikipedia.org/wiki/Birthday_paradox#Cast_as_a_collision_problem了解详情。

仅仅丢弃 MD5 中的一半位我会感到不舒服;最好对高位和低位 64 位字进行异或,以便让它们有机会混合。话又说回来,MD5 绝不是快速或安全的,所以我根本不会为它操心。如果您想要令人眼花缭乱的速度和良好的分发,但又不想假装安全,您可以尝试 64 位版本的 MurmurHash。请参阅http://en.wikipedia.org/wiki/MurmurHash了解详细信息和代码。

关于hash - 使用一个 64 位数字唯一标识 URL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1096558/

相关文章:

string - perl null 或空检测

algorithm - 如何将我自己的哈希(摘要)算法添加到 openssl

go - 在 golang 中散列多个值

java - hash()%n 和 n%hash() 有什么区别

python - Python中的生日悖论与蒙特卡罗方法?

java随机字符串生成和生日悖论

encryption - 如何设计系统以允许加密迁移?

c# - 在字符串上调用 GetHashCode() 时得到重复值的概率

hash - 哈希冲突的例子?

arrays - 如何使用 PowerShell 将嵌套 JSON 哈希表的内容输出到 PSO?