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