哈希的唯一值=唯一哈希?

时间:2010-05-04 19:04:00

标签: php string hash random unique

理论上,散列一个唯一值会产生一个独特的值吗?

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

$code = sha1($id);

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

如果我追加当前时间怎么办?例如:

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

感谢。

4 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:-1)

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

值的哈希值是原始值的压缩表示。通过删除信息来创建哈希,您正在丢失使其在域中唯一的部分因素,从而增加该值不是唯一的概率。保证它是唯一的唯一方法是使用原始值本身,这会破坏散列的目的。

答案 3 :(得分:-1)

人们不得不问这个问题,为什么你会这样做呢?如果您的数据库已经为您提供了唯一标识符,为什么还需要生成另一个唯一标识符?

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

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