假设我假设我在 php 中使用 sha1 函数时是否发生哈希冲突。
这段代码会永久避免它还是我必须使用任何其他方式
$filename=sha1($filename.'|'.microtime());
OR
$filename=sha1($filename.'|'.rand());
如果没有,则此代码不提供哈希冲突保护。
如果我假设 db 中可能有超过 100,000 个条目,我应该怎么做才能避免任何类型的哈希冲突。
sha1 不太可能发生哈希冲突。sha1 碰撞的概率可以忽略不计
并且哈希冲突风险是不切实际的。到目前为止还没有人发现 sha1 碰撞。所以你可以安全地使用它。
使用像微时间或随机数这样的盐可能会降低概率,但你根本无法避免它。
而您使用的是 sha1(string),无论字符串是混合值还是单个字符串。所以使用 microtime 和 rand 函数不会影响哈希冲突的概率。
因此,sha1(mixedvalue) 冲突可能等于或大于 sha1(filename) 的冲突,所以这当然没有用。
所以不要担心,如果你愿意,可以使用这种或简单的方法,它不会在未来产生问题,考虑哈希冲突是浪费时间,机会非常非常少。
需要明确的是,您不能完全避免哈希冲突。它是对有限数量的输出的无限数量的输入,但您可以考虑文件大小、当前系统时间和其他数据以用作盐,这将增加您的消息摘要的熵。
这些都不能避免哈希冲突。
当您有一个算法生成特定大小的散列时,就会发生散列冲突,而不管起始值如何。
哈希冲突是指两个不同的值,例如“mypassword”和“dsjakfuiUIs2kh-1jlks”,由于对它们执行的数学运算而最终生成相同的哈希。
您无法编写代码来防止哈希冲突,这种情况发生的频率取决于您使用的哈希算法。
只需 sha1() 整个文件路径,而不仅仅是文件名。文件名 xy.png 只能是目录中的一个,因此您的哈希对于该文件名将是唯一的。此外,这样做的好处是你不会有重复的文件(而使用 rand()/microtime() 你可以在同一个目录中获得同一个文件 10 次,如果它是一个 1GB 的文件可能会导致问题)