理论上,将唯一值哈希化是否会产生唯一值?
假设我有一个带有2个列的DB表:id和code。id是自增整数,code是varchar类型。如果我执行...
$code = sha1($id);
…然后将$code存储在与$id相同的行中。那么我的code列也是唯一的吗?
如果我添加当前时间呢?例如:
$code = sha1($id . time());
感谢您的选择。
理论上,将唯一值哈希化是否会产生唯一值?
假设我有一个带有2个列的DB表:id和code。id是自增整数,code是varchar类型。如果我执行...
$code = sha1($id);
…然后将$code存储在与$id相同的行中。那么我的code列也是唯一的吗?
如果我添加当前时间呢?例如:
$code = sha1($id . time());
有一种很小的可能性,即两个不同的值会产生相同的哈希值。虽然非常小,但并非不可能。
这取决于哈希算法。但从理论上讲,除非哈希与原始字符串完全相同,否则哈希有可能不是唯一的。
值的哈希是原始值的简化表示。通过删除信息片段来创建哈希,您正在失去使其在域中独特的部分,因此增加了该值不唯一的概率。保证它是唯一的唯一方法是使用原始值本身,这违背了哈希的目的。
我们必须问这个问题,为什么你想要这样做?如果你的数据库已经提供了一个唯一标识符,为什么还需要生成另一个唯一标识符呢?
你可能还希望考虑到,在 PHP 之外,许多数据库引擎会为你生成 UUID 样式的主键,如果这是你需要的话。
这里的重点是,像 sha1() 这样的哈希算法并不适用于这种类型的工作;它们用于验证两个(潜在非常长的)字符串输入是否相同。与类似但不完全相同的字符串发生冲突的机会非常小,但与非常不同的字符串发生冲突的机会则变得更高。