在php中使用sha1进行哈希时避免哈希冲突


Avoiding hash collision in php when using sha1 for hashing

假设我在php中使用sha1函数时发生哈希冲突。

这段代码将永久避免它还是我必须使用其他方法

$filename=sha1($filename.'|'.microtime());
OR
$filename=sha1($filename.'|'.rand());

如果没有,此代码不提供防止哈希冲突的保护。

如果我假设db中有超过100,000个条目,我应该做些什么来避免任何类型的哈希冲突

sha1不太可能发生哈希冲突。sha1碰撞的概率可以忽略

和哈希碰撞风险是不实际的。到目前为止还没有人发现一次碰撞。所以你可以安全地使用它。

使用微时间或随机数可能会降低概率,但你根本无法避免它。

你正在使用的是sha1(字符串),无论字符串是混合值还是单个字符串。所以使用microtime和rand函数不会影响哈希碰撞的概率。

因此sha1(mixedvalue)的冲突可能等于或大于sha1(filename)的冲突,所以这当然是没有用的。

所以不用担心,如果你喜欢使用这个或简单的方法,它不会在未来产生问题,考虑哈希冲突是浪费时间,当机会非常非常非常少

需要说明的是,您不能完全避免哈希冲突。它是无限数量的输入到有限数量的输出,但您可以考虑文件大小,当前系统时间和其他数据作为盐,这将增加您的消息摘要的熵。

只需sha1()整个文件路径,而不仅仅是文件名。文件名xy.png在一个目录中只能是一个,因此您的散列对于该文件名将是唯一的。此外,这样做的好处是不会有重复的文件(使用rand()/microtime()可以在同一目录下获得相同的文件10次,如果是1GB的文件可能会导致问题)

这两种方法都不能避免哈希冲突。

当你有一个算法生成一个特定大小的哈希时,就会发生哈希冲突,而不管初始值是什么。

哈希冲突是指两个不同的值,如"我的密码"answers"djakfuiuis2kh -1jlks",由于对它们进行了数学运算,最终生成了相同的哈希。

你不能编写代码来防止哈希冲突,这种情况发生的频率取决于你使用的哈希算法。