Php 如何为数组生成唯一密钥?

Php 如何为数组生成唯一密钥?,php,hash-collision,Php,Hash Collision,我想根据数组的内容生成一个唯一标识符。我最初的做法是简单地做: $key = md5(json_encode($array)); 但是,我想绝对确保密钥是唯一的,并且两个不同的数组可能产生相同的md5哈希。目前的想法是: $key = base64_encode(json_encode($array)); 这保证是唯一的,但会产生相当长的密钥。我可以使用sha512吗?或者这种类型的散列是否与md5具有相同的密钥冲突可能性?有没有办法生成比base64方法更短的密钥,base64方法100%

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

$key = md5(json_encode($array));
但是,我想绝对确保密钥是唯一的,并且两个不同的数组可能产生相同的md5哈希。目前的想法是:

$key = base64_encode(json_encode($array));
这保证是唯一的,但会产生相当长的密钥。我可以使用sha512吗?或者这种类型的散列是否与md5具有相同的密钥冲突可能性?有没有办法生成比base64方法更短的密钥,base64方法100%保证唯一


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

如果您想要一个100%保证的唯一密钥来匹配您的内容,那么唯一的方法就是使用内容的完整长度。您可以按原样使用json_编码的字符串,如果您想要一个没有任何“特殊”字符的字符串,也可以通过base64_encode()或bin2hex()或类似方式运行它。任何散列函数(如md5、sha1、sha256等)显然都不能是100%唯一的,因为它们具有固定的长度,并且由于存在一定的非唯一性,输入内容的结果必须大于散列


实际上,md5和sha1冲突现在已经发布,但是在很长一段时间内不存在已知或预期冲突的情况下,存在更强的哈希函数,因此您也可以考虑使用现代哈希算法,并且非常安全,不会有任何重复。

是否应该基于数组的内容?如果没有,请使用uuid或类似的工具?是,请回答数组内容更新问题。我不太明白你的建议。数组不包含任何唯一id。这正是我想要生成的。base64不是散列,它是数据本身,是可逆的,冲突机会将基于您使用的散列函数,我认为没有任何一个完全有100%的机会,你的问题是生成一个100%保证的唯一密钥,但是你正在使用数组的内容生成一个散列。是否应该从数组的内容派生唯一键?这就是我的问题。如果你使用一个哈希函数,它有有限的可能值,那么根据定义,你永远不能100%确定。这是不可能的,在你的有生之年,你会遇到碰撞,即使是对于
MD5
,但是-这不是100%确定的。这是一个XY问题,为什么不问问你真正的问题呢?显然,您正在处理数据,您需要确保没有收到重复的数据或类似的数据。我将把这个感知的解决方案放在一边,询问这个哈希方法应该解决的真正问题。谢谢。我相信这回答了我的问题。