理论上,散列一个唯一值会产生一个独特的值吗?
假设我有一个包含2列的数据库表:id和code。 id是一个自动递增的int,代码是一个varchar。如果我这样做......
$code = sha1($id);
...然后将$ code存储到与$ id相同的行中。我的代码列是否也是唯一的?
如果我追加当前时间怎么办?例如:
$code = sha1($id . time());
感谢。
答案 0 :(得分:7)
一般来说,答案是否定的。这很简单:SHA-1有2 ^ 160个不同的输出--160位,但还有更多的输入(例如,有2 ^ 320个不同的40字节字符串,并且它们不能全部映射到独特的输出)。
给定足够的值子集,答案可能是。这取决于确切的算法和子集的大小:如果可能的输入数量小于可能的输出数量,则可能(但不保证)。在考虑这一点时,记住birthday paradox可能会有所帮助:碰撞的概率不会随着输入的数量而线性增加。
答案 1 :(得分:0)
两个不同的值给出相同的散列的可能性很小。虽然非常小,但并非不可能。
答案 2 :(得分:-1)
这取决于散列算法。但理论上,除非哈希与原始字符串完全相同,否则哈希可能不是唯一的。
值的哈希值是原始值的压缩表示。通过删除信息来创建哈希,您正在丢失使其在域中唯一的部分因素,从而增加该值不是唯一的概率。保证它是唯一的唯一方法是使用原始值本身,这会破坏散列的目的。
答案 3 :(得分:-1)
人们不得不问这个问题,为什么你会这样做呢?如果您的数据库已经为您提供了唯一标识符,为什么还需要生成另一个唯一标识符?
您可能还希望考虑在PHP之外,如果您需要,许多数据库引擎将为您生成UUID样式主键。
这里的要点是哈希算法(如sha1())不适用于此类工作;它们用于验证两个(可能很长)的字符串输入是否相同。与类似但非精确的字符串发生碰撞的可能性非常小,但与非常不同的字符串发生碰撞的可能性要高得多。