sha1_file 足够好吗?
使用 sha1_file 就足够了,碰撞的可能性很小,但几乎永远不会发生。为了将比较文件大小的机会也减少到几乎为 0:
function is_duplicate_file( $file1, $file2)
{
if(filesize($file1) !== filesize($file2)) return false;
if( sha1_file($file1) == sha1_file($file2) ) return true;
return false;
}
md5 比 sha1 更快,但它生成的唯一输出较少,因此使用 md5 时发生冲突的机会仍然很小。
可扩展性?
比较文件的方法有多种,使用哪种方法取决于你的性能问题,我对不同的方法做了小测试:
1- 直接文件比较:
if( file_get_contents($file1) != file_get_contents($file2) )
2- Sha1_文件
if( sha1_file($file1) != sha1_file($file2) )
3- md5_文件
if( md5_file($file1) != md5_file($file2) )
结果:2个文件,每个1.2MB,比较100次,我得到以下结果:
--------------------------------------------------------
method time(s) peak memory
--------------------------------------------------------
file_get_contents 0.5 2,721,576
sha1_file 1.86 142,960
mdf5_file 1.6 142,848
file_get_contents 是最快的,比 sha1 快 3.7,但内存效率不高。
Sha1_file 和 md5_file 是内存高效的,它们使用的内存大约是 file_get_contents 使用的内存的 5%。
md5_file 可能是一个更好的选择,因为它比 sha1 快一点。
所以结论是,这取决于您是否想要更快的比较或更少的内存使用。