2017-04-14 102 views
2

我想生成一个基于数组内容的唯一标识符。我最初的方法是简单地做:如何为阵列生成唯一的密钥?

$key = md5(json_encode($array)); 

不过,我想绝对确保关键是独特的,有远程可能性,即两个不同的阵列可以产生相同的MD5哈希值。目前的想法是:

$key = base64_encode(json_encode($array)); 

这是保证是唯一的,但产生一个相当长的关键。我可以使用sha512还是这种类型的散列函数与md5具有相同的关键冲突潜力?有没有什么办法可以生成比base64方法更短的密钥?这种方法100%保证是唯一的?

要100%清楚,我的问题是:如何为一组数据生成最短可能的100%唯一标识符?

+0

Downvoter,我很想知道这太宽泛了。它包含最低限度的代码来演示这个问题以及我尝试过的并且提出了一个非常具体的问题。 – billynoah

+0

应该基于数组的内容吗?如果没有,使用uuid或类似的东西? – Robert

+0

是的数组内容 - 更新的问题。不知道我理解你的建议。数组不包含任何唯一的ID。这正是我想要生成的。 – billynoah

回答

5

如果您希望100%保证唯一密钥与您的内容相匹配,那么唯一的方法就是使用您的内容的全部长度。你可以按原样使用json_encoded字符串,或者如果你想要一个没有任何“特殊”字符的字符串,你可以通过base64_encode()或bin2hex()或类似的方式运行它。像md5,sha1,sha256等任何散列函数显然不能100%唯一 - 因为它们具有固定长度,并且由于https://en.wikipedia.org/wiki/Pigeonhole_principle,对于大于散列的输入内容必须有非唯一结果。

在实践中,md5和sha1碰撞现在已经发布,但更强大的哈希函数存在于长时间未知或未预期碰撞的情况下,因此您还可以使用现代哈希算法进行研究,并且相当安全将不会有任何重复。

+0

谢谢。我相信这回答了我的问题。 – billynoah