这基本上是一个数学问题,但与编程非常相关:如果我有 10 亿个包含 URL 的字符串,并且我取每个字符串的 MD5 哈希值的前 64 位,我应该期望什么样的冲突频率?
如果我只有 1 亿个网址,答案会如何变化?
在我看来,碰撞是极其罕见的,但这些事情往往令人困惑。
使用 MD5 以外的其他东西会更好吗?请注意,我不是在寻找安全性,只是在寻找一个良好的快速哈希函数。此外,MySQL 的 native 支持也很好。
最佳答案
如果 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/