如何为数组生成唯一键?

How to generate a unique key for an array?

我想根据数组的内容生成一个唯一标识符。我最初的方法是简单地做:

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

但是,我想绝对确定密钥是唯一的,并且两个不同的数组极有可能产生相同的 md5 散列。目前的想法是:

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

这保证是唯一的,但会产生相当长的密钥。我可以使用 sha512 还是这种类型的散列也具有与 md5 相同的密钥冲突可能性?有什么方法可以生成比 100% 保证唯一的 base64 方法更短的密钥吗?

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

如果您想要 100% 保证的唯一密钥来匹配您的内容,那么唯一的方法就是使用您的内容的全长。您可以按原样使用 json_encoded 字符串,或者如果您想要一个没有任何 "special" 个字符。任何哈希函数,如 md5、sha1、sha256 等显然不能 100% 唯一 - 因为它们具有固定长度,并且由于 https://en.wikipedia.org/wiki/Pigeonhole_principle 对于大于哈希的输入内容,必然存在非唯一结果.

实际上,md5 和 sha1 冲突现已公布,但在很长一段时间内没有已知或预期的冲突的情况下存在更强大的散列函数,因此您也可以考虑使用现代散列算法并确保相当安全你不会有任何重复。