【问题标题】:How to generate a unique key for an array?如何为数组生成唯一键?
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 谢谢。我相信这回答了我的问题。
猜你喜欢
  • 2015-05-11
  • 2015-05-03
  • 2020-09-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-02
  • 1970-01-01
  • 2020-09-17
相关资源
最近更新 更多