Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 唯一值的散列=唯一散列?_Php_String_Hash_Random_Unique - Fatal编程技术网

Php 唯一值的散列=唯一散列?

Php 唯一值的散列=唯一散列?,php,string,hash,random,unique,Php,String,Hash,Random,Unique,从理论上讲,散列唯一值会产生唯一值吗 假设我有一个DB表,有两列:id和代码。id是一个自动递增的int,代码是一个varchar。如果我这样做 $code = sha1($id); 。。。然后将$code存储到与$id相同的行中。我的code列也将是唯一的吗 如果我附加当前时间呢?例如: $code = sha1($id . time()); 谢谢。这取决于哈希算法。但从理论上讲,除非散列与原始字符串完全相同,否则散列可能不是唯一的 值的哈希是原始值的压缩表示。通过删除信息片段来创建散列,

从理论上讲,散列唯一值会产生唯一值吗

假设我有一个DB表,有两列:id和代码。id是一个自动递增的int,代码是一个varchar。如果我这样做

$code = sha1($id);
。。。然后将$code存储到与$id相同的行中。我的code列也将是唯一的吗

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

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

谢谢。

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


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

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

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


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

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

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


这里的要点是,像sha1()这样的散列算法不适合这种类型的工作;它们用于验证两个(可能很长)字符串输入是否相同。与类似但不完全相同的字符串发生冲突的可能性非常小,但与非常不同的字符串发生冲突的可能性会大大增加。

谢谢。因此,获取唯一值的唯一方法是生成并扫描数据库,以检查它是否存在(如果存在,请重复)?这正是我在这里试图避免做的,但我想这是唯一的方法。不幸的是,如果你想保证一个唯一的值,没有其他方法。这也是您无法轻松反转哈希的原因:我可以告诉您,“1”的SHA-1哈希是“356a192b7913b04c54574d18c28d46e6395428ab”,但还有许多其他值将生成该哈希。我明白了。问题是我可能不需要生成超过1000个唯一值。在这种情况下,可以安全地说所有的值都是唯一的吗?不。即使只有两个值,它们散列到相同值的几率仍然是1/2^160。这可能看起来非常小,但仍然大于0,这意味着,尽管1000个值可能都散列到不同的值,但如果不进行测试,就无法保证。如果您事先知道可能的值,您可以计算所有值的散列,将它们放入列表中,然后按散列排序-这将很容易找到重复的值。您是对的,谢谢。根据RenderIn的建议,我最终选择了uniqid。我不能肯定地说,但我不认为你的散列可以保证是唯一的,因为sha1函数的输出是有限的。这表明,由于潜在密钥的数量是无限的,因此在加密时,某些不同的密钥必须映射到相同的值。但是我不知道sha1算法的内部结构,所以我不能告诉您,在1和数据库的数字列max val hash之间是否有任何数字是相同的值。也许有人知道这个问题的答案,但我认为你最好用另一种方法$code=uniqid()?很酷,谢谢。我不知道uniqid(),我一定会看一看。“保证它唯一的方法是使用原始值本身”——显然不是真的@Martin-请解释一下你的意思,为什么我的陈述不真实?哈希显然不必是原始字符串才能保证唯一性。例如,它可能是原始字符串,但仍然是唯一的。