c# - 将图像存储为哈希码 C#

标签 c# .net image hash

我正在构建一个将存储数百万张图片的网站,因此我需要为每张图片分配一个唯一的 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/

相关文章:

c# - 当 ContentControl.Content 改变时开始动画

c# - 如何在源集合为空时强制 LINQ Sum() 返回 0

c# - 从异步方法立即抛出

.net - 在 .NET 中实现虚拟文件系统

Android - .nomedia 不适用于图像

css - 重复背景图片有问题

javascript - 对图像上特定坐标处的鼠标单击事件使用react

c# - 序列化期间出现异常 - 不应使用具有数据协定名称的类型

C#:如何实现 IOrderedEnumerable<T>

c# - 使 Entity Framework 只读