我正在构建一个将存储数百万张图片的网站,因此我需要为每张图片分配一个唯一的 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));
}
最佳答案
如果我理解正确的话,您想指定一个 SHA1 值作为文件名,这样您就可以检测您的收藏中是否已经有该图像。我不认为这是最好的方法(如果你没有运行数据库那么也许它是)但是,如果你打算拥有数百万的图像那么(出于实际原因)只是认为碰撞是不可能发生的。
出于这个目的,我不会推荐 SHA256,因为主要的两个优点(抗碰撞性 + 对某些理论攻击的免疫力)并不值得,因为它比 SHA1 慢 10 倍左右(而且你会散列很多相当大的文件)。
你不应该害怕它的 128 位长度:为了有 50% 的机会在 128 位中找到碰撞,你需要在你的集合中有 18446744073709600000 张图像(2^128 的平方)。
哦,我不想听起来自负或其他任何东西,但散列和密码学是截然不同的东西。事实上,我认为散列法更接近于代码签名/数字签名,而不是密码学。
关于c# - 将图像存储为哈希码 C#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28921839/