【发布时间】:2017-04-14 14:50:16
【问题描述】:
我想根据数组的内容生成一个唯一标识符。我最初的方法是简单地做:
$key = md5(json_encode($array));
但是,我想绝对确定密钥是唯一的,并且两个不同的数组很可能会产生相同的 md5 哈希。目前的想法是:
$key = base64_encode(json_encode($array));
这保证是唯一的,但会产生相当长的密钥。我可以使用 sha512 还是这种类型的散列也具有与 md5 相同的密钥冲突可能性?有什么方法可以生成比 100% 保证唯一的 base64 方法更短的密钥?
为了 100% 明确,我的问题是:如何为一组数据生成最短的 100% 唯一标识符?
【问题讨论】:
-
应该是根据数组的内容吧?如果没有,请使用 uuid 或类似的东西?
-
是的数组内容 - 更新的问题。不确定我是否理解您的建议。数组不包含任何唯一 ID。这正是我想要生成的。
-
base64 不是哈希,它是数据本身,并且是可逆的,碰撞几率将取决于您使用的哈希函数,我认为没有一个完全 100% 的机会,但它们应该非常接近它。
-
您的问题是关于生成 100% 保证唯一的密钥,但您正在使用数组的内容来生成哈希。唯一键是否应该从数组的内容派生?那是我的问题。
-
如果您使用散列函数,它的可能值数量有限,那么根据定义,您永远无法 100% 确定。即使是
MD5,在您的一生中,您也不可能发生碰撞,但是 - 这不是 100% 确定的。这是一个XY问题,你为什么不问你遇到的真正问题?显然,您正在处理数据,并且需要确保您没有收到重复数据或类似的东西。我将把这个感知到的解决方案放在一边,并询问这种散列方法应该解决的真正问题。
标签: php hash-collision