我有一个关于md5函数唯一性的问题。
我知道md5 (具有微时间值)并不是唯一的,但是它们是非常独特的:)
如何计算md5散列的两个部分之间发生冲突的概率?
例如: php中的以下代码从md5结果中生成一个8个字符的字符串:
substr(md5(microtime()), 0, 8);第二种情况--如果它的索引是唯一的(所以它每次都会得到散列的不同部分)呢?
substr(md5(microtime()), rand(0, 32), 8);发布于 2017-09-06 20:32:48
有2^32个8个十六进制数字的组合。即使它们是完全随机的,在得到2个相同的字符串之前,您平均只能生成大约65000个这样的字符串。
无论是否使用随机索引,只要所有使用use的微时间()值都是唯一的,md5()就不会有任何重大变化。但是,如果生成它们的速度太快,或者跨多台机器生成,那么情况会更糟,因为很可能最终会使用相同的microtime()值两次。
发布于 2017-09-06 17:43:25
当您询问字符串的唯一性时,它实际上是一个概率。意味着您将使用尽可能多的字符串字符,并且您创建的随机字符串长度越多,获得类似随机字符串的机会就越少。
因此,为了获得唯一的字符串,你需要将字符串存储在数据库中,并与随机字符串进行比较,如果发现相似,则再次寻找新的新字符串,直到获得唯一的字符串。
发布于 2017-09-06 19:01:59
这取决于您将生成多少“子哈希”,以及从原始MD5哈希中保留多少位(“子哈希”的长度)。如果你只生成了1个子散列,并且只保留了1位,那么根本就没有冲突。如果你生成2个子散列,预计会有50%的冲突。使用2比特,几率为25%。你自己算吧。更多信息请参考生日悖论
https://stackoverflow.com/questions/46071677
复制相似问题