gpt4 book ai didi

php - 使用纯 PHP 验证两个文件是否相同?

转载 作者:IT王子 更新时间:2023-10-29 00:03:50 26 4
gpt4 key购买 nike

TL;DR:我有一个 CMS 系统,它使用文件内容的 SHA-1 作为文件名来存储附件(不透明文件)。鉴于我已经知道两个文件的 SHA-1 哈希匹配,如何验证上传的文件是否真的与存储中的文件匹配?我想要高性能。

长版:

当用户向系统上传新文件时,我会计算上传文件内容的 SHA-1 哈希值,然后检查后端存储中是否已存在具有相同哈希值的文件。在我的代码运行之前,PHP 将上传的文件放在 /tmp 中,然后我对上传的文件运行 sha1sum 以获取文件内容的 SHA-1 哈希值。然后,我根据计算出的 SHA-1 哈希计算扇出,并确定 NFS 挂载目录层次结构下的存储目录。 (例如,如果文件内容的 SHA-1 哈希为 37aefc1e145992f2cc16fabadcfe23eede5fb094,则永久文件名为 /nfs/data/files/37/ae/fc1e145992f2cc16fabadcfe23eede5fb094。)除了保存实际文件内容外,我还为用户提交的元数据(例如 Content-Type、原始文件名、日期戳等)INSERT 将新行插入到 SQL 数据库中.

我目前正在弄清楚的极端情况是新上传的文件的 SHA-1 哈希值与存储后端中的现有哈希值相匹配。我知道这种意外发生的变化在天文数字上很低,但我想确定一下。 (有关特意案例,请参阅 https://shattered.io/ )

给定两个文件名 $file_a$file_b,如何快速检查两个文件是否具有相同的内容? 假设文件太大加载到内存中。对于 Python,我会使用 filecmp.cmp() 但 PHP 似乎没有任何类似的东西。我知道这可以通过 fread() 完成,如果发现不匹配的字节则中止,但我不想编写该代码。

最佳答案

如果你已经有了一个 SHA1 和,你可以简单地做:

if ($known_sha1 == sha1_file($new_file))

否则

if (filesize($file_a) == filesize($file_b)
&& md5_file($file_a) == md5_file($file_b)
)

还要检查文件大小,以在一定程度上防止哈希冲突(这已经不太可能了)。还使用 MD5,因为它比 SHA 算法快得多(但不那么独特)。如果您希望发生碰撞的几率更低,请使用 sha1_file()


这就是如何准确地相互比较两个文件。
这将比本地哈希函数运行得慢得多。

function compareFiles($file_a, $file_b)
{
if (filesize($file_a) != filesize($file_b))
return false;

$chunksize = 4096;

$fp_a = fopen($file_a, 'rb');
$fp_b = fopen($file_b, 'rb');

try
{
while (!feof($fp_a) && !feof($fp_b))
{
$d_a = fread($fp_a, $chunksize);
$d_b = fread($fp_b, $chunksize);
if ($d_a === false || $d_b === false || $d_a !== $d_b)
return false;
}

return true;
}
finally
{
fclose($fp_a);
fclose($fp_b);
}
}

关于php - 使用纯 PHP 验证两个文件是否相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18849927/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com