可能重复:
如何在C#中从字节数组生成哈希码
在C#中,我需要创建一个图像的哈希值,以确保它在存储时是唯一的。
我可以很容易地将其转换为字节数组,但不确定该如何继续操作。
是否有.NET框架中的任何类可以帮助我,或者有人知道一些创建这样一个唯一哈希的高效算法吗?
可能重复:
如何在C#中从字节数组生成哈希码
在C#中,我需要创建一个图像的哈希值,以确保它在存储时是唯一的。
我可以很容易地将其转换为字节数组,但不确定该如何继续操作。
是否有.NET框架中的任何类可以帮助我,或者有人知道一些创建这样一个唯一哈希的高效算法吗?
.NET有很多散列校验和提供程序可以创建加密哈希值,这些哈希值唯一(对于大多数情况来说是防碰撞的),符合您的条件。它们都非常快速,哈希肯定不会成为应用程序的瓶颈,除非您要进行一万亿次以上的操作。
就我个人而言,我喜欢SHA1:
public static string GetHashSHA1(this byte[] data)
{
using (var sha1 = new System.Security.Cryptography.SHA1CryptoServiceProvider())
{
return string.Concat(sha1.ComputeHash(data).Select(x => x.ToString("X2")));
}
}
即使有人说一个方法可能比另一个方法慢,这都是相对的。 一个处理图像的程序绝对不会注意到生成哈希值的微秒级处理。
关于碰撞,对于大多数情况而言,这也是无关紧要的。 即使像MD5这样“过时”的方法在大多数情况下仍然非常有用。 只有当您的系统的安全性依赖于防止碰撞时才建议不要使用它。
您可以使用任何标准散列算法,但散列本质上无法保证唯一性。散列旨在成为相对快速和/或小型的标记,以便查看一条数据是否很可能与另一条数据相同。完全不同的数据集也可能产生相同的哈希值,尽管能够通过算法生成这些哈希值非常困难。
总之,在检查可能身份时,MD5相当快。 SHA更可靠(由于MD5已被破解,因此不应用于安全),但速度较慢。