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
。)除了保存实际文件内容外,我INSERT
在 SQL 数据库中为用户提交的元数据(例如Content-Type
,原始文件名、日期戳等)。
我目前正在弄清楚的极端情况是新上传的文件具有与存储后端中现有哈希匹配的 SHA-1 哈希的情况。我知道这种意外发生的变化是天文数字的低,但我想确定一下。(有关特意案例,请参阅https://shattered.io/)
给定两个文件名$file_a
和$file_b
,如何快速检查两个文件是否具有相同的内容?假设文件太大而无法加载到内存中。使用 Python,我会使用filecmp.cmp()
,但 PHP 似乎没有类似的东西。我知道如果找到不匹配的字节,这可以完成fread()
并中止,但我宁愿不编写该代码。