比较PHP中的文件校验和


Comparing file checksums in PHP

我正在写一个文件上传网站,我对节省空间很感兴趣。如果用户上传了一个文件,我想确保这个文件之前没有被上传过(如果已经上传过,我将只指向数据库中现有的文件)。

我考虑在文件上使用sha1_file(),检查数据库以查看摘要是否存在于摘要数据库中。然后我想起了鸽子洞原理,并决定检查未消化的文件是否存在sha1摘要匹配。

这对我来说似乎效率低下。我想我可以在检查和匹配的情况下检查每个文件的前千字节。

我没有过多考虑RAM和ROM的价值,检查文件所需的处理能力可能比我节省的存储空间花费更多。

这种方法有什么缺点吗?我是不是在浪费时间纠结这些?

您可以使用md5( file_data )来生成文件的名称,并且永远不可能以不同的名称上传相同的文件。唯一的问题是,从技术上讲,两个不同的文件可能生成相同的md5,但这不太可能,特别是如果两个文件具有相同的扩展名,所以您可以认为这不是问题。在这个原理图下,甚至没有必要检查。如果两个哈希值相同,它只会覆盖存储的文件。这就是大多数文件存储引擎的内部工作方式,比如zimg。如果您担心冲突,您可以首先查看该文件是否存在计算散列和扩展名,如果存在,则可以将该存储文件的数据与您试图存储的文件的数据进行比较。如果数据不相等,你可以让它给你发邮件提醒。

$data = file_get_contents('flowers.jpg');
$name = md5($data).'.jpg';
$fh = fopen($name,'w+');
fwrite($fh,$data);
fclose($fh);