假设您想创建一个文件托管站点供人们上传他们的文件并发送链接给他们的朋友以便以后检索它,并且您希望确保文件在我们存储的地方重复,PHP的sha1_file是否足以完成任务?有没有理由不使用md5_file?
对于前端,它将使用数据库中的原始文件名存储来模糊,但是如果这将揭示有关原始海报的任何内容,则会有一些额外的问题.文件是否继承了上次修改过的任何元信息,或者是谁发布过的,或者是基于文件系统的东西?
另外,使用盐轻浮,因为彩虹表攻击的安全性对此没有任何意义,哈希以后可以用作校验和?
最后一点,可伸缩性?最初,它只会用于几个megs的小文件,但最终…
编辑1:哈希的主要目的是避免文件重复,而不是创建模糊.
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_file
if( sha1_file($file1) != sha1_file($file2) )
3- md5_file
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快一点.
因此,结论是,如果您想要更快的比较或更少的内存使用,它取决于它.