从理论上讲,散列唯一值会产生唯一值吗?
假设我有一个包含两列的DB表: id和code。id是一个自动递增的int,code是一个varchar。如果我这么做了..。
$code = sha1($id);
..。然后将$code存储在与$id相同的行中。我的代码列也是唯一的吗?
如果我追加当前时间呢?例如:
$code = sha1($id . time());
谢谢。
发布于 2010-05-04 19:08:24
一般来说,答案是否定的。这很容易说明: SHA-1有2^160个不同的输出- 160位,但还有更多的输入(例如,有2^320个不同的40字节字符串,它们不能全部映射到唯一的输出)。
给定值的足够子集,答案是可能的。这取决于确切的算法和子集的大小:如果可能输入的数量小于可能输出的数量,那么这是可能的(但不能保证)。考虑这一点时,牢记birthday paradox可能会有所帮助:冲突的概率不会随着输入数量的增加而线性增加。
发布于 2010-05-04 19:06:38
两个不同的值给出相同散列的可能性很小。虽然很小,但也不是不可能。
发布于 2010-05-04 19:05:18
这取决于散列算法。但从理论上讲,除非散列与原始字符串完全相同,否则散列可能不是唯一的。
值的散列是原始值的压缩表示。通过删除信息片段来创建散列,您丢失了使散列在域中唯一的部分,从而增加了值不是唯一的可能性。保证其唯一性的唯一方法是使用原始值本身,这违背了散列的目的。
https://stackoverflow.com/questions/2768191
复制相似问题