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.)除了保存实际文件内容外,我还在INSERTSQL数据库中为用户提交的元数据添加了新行(例如Content-Type,原始文件名) ,datestamp等).
我目前正在弄清楚的一个案例是新上传的文件具有与存储后端中的现有哈希匹配的SHA-1哈希.我知道事故发生的变化是天文数字低,但我想确定.(有关用例,请参阅https://shattered.io/)
由于两个文件名$file_a以及$file_b,如何快速检查,如果这两个文件具有相同的内容是什么?假设文件太大而无法加载到内存中.使用Python,我会使用,filecmp.cmp()但PHP似乎没有任何类似的东西.我知道fread()如果找到一个不匹配的字节就可以完成和中止,但我宁愿不写那个代码.
我正在建立一个网站,将存储数百万图像,所以我需要每个图像的唯一ID.什么密码术最适合存储图像.现在这是我的代码看起来像使用SHA1.
是否在sha1旁边使用了标准哈希,两个图像是否可能具有相同的哈希码?
Image img = Image.FromFile("image.jpg");
ImageConverter converter = new ImageConverter();
byte[] byteArray = (byte[])converter.ConvertTo(img, typeof(byte[]));
string hash;
using (SHA1CryptoServiceProvidersha1 = new SHA1CryptoServiceProvider())
{
hash = Convert.ToBase64String(sha1.ComputeHash(byteArray));
}
Run Code Online (Sandbox Code Playgroud) 每次进行提交时,git / hg都会生成一个SHA来在存储库的历史记录中唯一标识该提交。
假设我要合并两个存储库(我们没有关于哪个存储库的信息)。这就提出了一个问题:如果有人想要提交相同合并仓库的特定提交,会不会有重复的SHA哈希值在引起评论时混淆git?如果不是这样,git会做什么?
最终,我猜问题还是:全世界的每个存储库都有重复的哈希值吗?
可能的重复:
使用 PHP 检查图像是否唯一的好方法是什么?
用户通过表单上传图像 ( png, jpg, gif)。我正在使用 hash_file 检查数据库以查看图像是否已经上传,但我现在注意到它不是唯一的。
这是一个错误还是我应该使用其他东西来为文件生成一个唯一的 ID?
我想解决方法是md5(filesize($file) . $hash)?
更新 从日志...第一组使用 md5_file,第二组来自 hash_file 和 sha256...
哈希:从 tbl_image_hashes 中选择 SiteID,其中 SiteID = 0 AND 哈希 = 'd41d8cd98f00b204e9800998ecf8427e' 哈希:从 tbl_image_hashes 中选择 SiteID,其中 SiteID = 0 AND 哈希 = 'd41d8cd98f00b204e9800998ecf8427e' 哈希:从 tbl_image_hashes 中选择 SiteID,其中 SiteID = 0 AND 哈希 = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855' 哈希:从 tbl_image_hashes 中选择 SiteID,其中 SiteID = 0 AND 哈希 = 'e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855' 哈希:从 tbl_image_hashes 中选择 SiteID,其中 SiteID = 0 AND 哈希 …
我有一些脚本可以在我们的主机(Gitlab)中查询项目的所有标签以及标签指向的提交哈希值。然后它对这些哈希值进行更多处理。
这通常是有效的,但我有一个提交,其中我得到的哈希值与该提交上的 git 日志显示的哈希值不同。
问题是,这并不完全错误。返回的哈希值确实可以让我检查正确的提交:
>>git checkout 6a923
HEAD is now at ae67e044
Run Code Online (Sandbox Code Playgroud)
和
>>git log -1 6a923
commit ae67e044359c86781fd7c1b74016f858f00584f8 (HEAD, tag: <correct tag>)
Run Code Online (Sandbox Code Playgroud)
但当我稍后想做类似比较哈希之类的事情时,它显然不起作用。
我认为哈希是唯一的。这似乎是某种别名哈希。这里发生了什么?
附加信息:
>>git cat-file -p 6a923
object ae67e044359c86781fd7c1b74016f858f00584f8
type commit
tag <correct tag>
tagger <correct tagger> 1558448485 -0400
Run Code Online (Sandbox Code Playgroud) hash ×5
file-upload ×2
git ×2
php ×2
sha1 ×2
.net ×1
algorithm ×1
c# ×1
file-io ×1
git-commit ×1
image ×1
performance ×1
probability ×1
sha ×1