我对md5功能的唯一性有疑问。
我知道md5(具有microtime值)不是唯一的,但是,它们非常独特:)
如何计算md5哈希值的两个部分之间发生碰撞的概率?
例如:php中的以下内容从md5结果生成8个字符串:
substr(md5(microtime()), 0, 8);
第二种情况 - 如果它的索引是唯一的(因此每次都得到散列的不同部分,该怎么办?)
substr(md5(microtime()), rand(0, 32), 8);
答案 0 :(得分:1)
有8个十六进制数字的2 ^ 32个组合。即使它们是完全随机的,平均来说,在你得到2之前,你只能生成大约65000个这样的字符串。
md5(),使用随机索引与否,只要所有microtime()值使用use都是唯一的,就不会显着改变任何东西。但是,如果你生成这些太快,或者在很多机器上生成,那么情况要糟糕得多,因为很有可能你最终会使用相同的microtime()值两次。
答案 1 :(得分:0)
当你询问字符串的唯一性时,它实际上是一个概率。意味着你将使用尽可能多的字符串字符以及你所使用的随机字符串的长度将获得更少获得类似随机字符串的机会。
因此,要获得唯一字符串,您需要在数据库中存储字符串并与随机字符串进行比较,如果您发现类似字符,则再次获取新的字符串,直到获得唯一字符串。
答案 2 :(得分:0)
这取决于有多少"子哈希"您将生成以及您从原始MD5哈希中保留多少位("子哈希"的长度)。如果只生成1个子哈希并保持1位,则根本不会发生冲突。如果生成2个子哈希,则期望50%的冲突。使用2位,赔率为25%。你做数学。有关详细信息,请参阅生日悖论