【问题标题】:Hash of unique value = unique hash?唯一值哈希=唯一哈希?
【发布时间】:2011-02-15 15:03:02
【问题描述】:

理论上散列唯一值会产生唯一值吗?

假设我有一个包含 2 列的数据库表:id 和 code。 id 是一个自动递增的 int,而 code 是一个 varchar。如果我这样做......

$code = sha1($id);

... 然后将 $code 存储到与 $id 相同的行中。我的代码列也会是唯一的吗?

如果我追加当前时间呢?例如:

$code = sha1($id . time());

谢谢。

【问题讨论】:

  • 不能肯定地说,但我不认为你的哈希可以保证是唯一的,因为 sha1 函数的输出数量有限。这表明由于存在无限数量的潜在密钥,因此某些不同的密钥在加密时必须映射到相同的值。我不知道 sha1 算法的内部结构,所以我不能告诉你 1 和你的数据库的数字列 max val hash 之间是否有任何数字到相同的值。有人可能知道这个问题的答案,但我认为使用不同的方法会更好。 $code=uniqid() ?
  • 非常感谢。我不知道uniqid(),我一定会看看。

标签: php string hash random unique


【解决方案1】:

一般来说,答案是否定的。这很容易显示:SHA-1 有 2^160 个不同的输出 - 160 位,但还有更多的输入(例如,有 2^320 个不同的 40 字节字符串,它们不能都映射到独特的输出)。

给定足够的值子集,答案是可能的。这取决于确切的算法和子集的大小:如果可能的输入数量小于可能的输出数量,那么它是可能的(但不能保证)。考虑到这一点,记住birthday paradox 可能会有所帮助:碰撞的概率不会随着输入的数量线性增加。

【讨论】:

  • 谢谢。所以获得唯一值的唯一方法是生成并扫描数据库以检查它是否存在(如果存在则重复)?这几乎是我试图避免在这里做的事情,但我想这是唯一的方法。
  • 不幸的是,如果你想保证一个独特的价值,没有别的办法。这也是为什么不能轻易反转哈希的原因:我可以告诉你,“1”的 SHA-1 哈希是“356a192b7913b04c54574d18c28d46e6395428ab”,但还有许多其他值会生成该哈希。
  • 我明白了。问题是我可能不需要生成超过 1000 个唯一值。可以肯定地说在这种情况下所有值都是唯一的吗?
  • 没有。即使只有两个值,它们仍然有 2^160 分之一的机会哈希到相同的值。这可能看起来无限小,但仍然大于 0,这意味着,尽管您的 1000 个值可能全部散列为不同的值,但如果不进行测试,则无法保证。如果您事先知道可能的值,您可以计算所有这些值的哈希值,将它们放在一个列表中,然后按哈希值对其进行排序——这样可以很容易地找到重复项。
  • 你是对的,谢谢。根据 RenderIn 的建议,我最终选择了 uniqid。
【解决方案2】:

两个不同的值给出相同的哈希值的可能性很小。虽然很小,但并非不可能。

【讨论】:

    【解决方案3】:

    这取决于散列算法。但理论上,除非散列与原始字符串完全相同,否则散列可能不唯一。

    值的散列是原始值的浓缩表示。通过删除信息片段来创建散列,您正在丢失使其在域中唯一的部分内容,因此增加了该值不是唯一的可能性。保证它唯一的唯一方法是使用原始值本身,这违背了散列的目的。

    【讨论】:

    • “保证它唯一的唯一方法是使用原始值本身” - 显然不是真的!
    • @Martin - 请解释一下你的意思,为什么我的陈述不真实?
    • 哈希显然不必是原始字符串以保证唯一性。例如,它可能是原始字符串 ROT13 ed,并且仍然是唯一的。
    【解决方案4】:

    必须问一个问题,您为什么要这样做?如果您的数据库已经为您提供了唯一标识符,为什么还需要生成另一个唯一标识符?

    您可能还希望考虑在 PHP 之外,如果您需要,许多数据库引擎将为您生成 UUID 样式的主键。

    这里的重点是 sha1() 等哈希算法不适用于此类工作;它们用于验证两个(可能很长)字符串输入是否相同。与相似但不精确的字符串发生冲突的可能性非常小,但与非常不同的字符串发生冲突的可能性要高得多。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-02-17
      • 1970-01-01
      • 2018-12-25
      • 2010-09-13
      • 2014-09-03
      • 2011-01-29
      • 1970-01-01
      • 2013-09-12
      相关资源
      最近更新 更多