joh*_*hnc 37 .net c# hash image
可能重复:
如何从c#中的字节数组生成哈希码
在C#中,我需要创建一个图像的哈希,以确保它在存储中是唯一的.
我可以轻松地将其转换为字节数组,但不确定如何从那里继续.
.NET框架中是否有任何可以帮助我的类,或者是否有人知道一些有效的算法来创建这样一个独特的哈希?
Rex*_*x M 60
.NET中有很多hashsum提供程序可以创建加密哈希 - 它可以满足您的条件,即它们是唯一的(大多数用途是防冲突的).它们都非常快,并且散列肯定不会成为你的应用程序的瓶颈,除非你做了一万亿次.
我个人喜欢SHA1:
string hash;
using(SHA1CryptoServiceProvider sha1 = new SHA1CryptoServiceProvider())
{
hash = Convert.ToBase64String(sha1.ComputeHash(byteArray));
}
Run Code Online (Sandbox Code Playgroud)
即使人们说一种方法可能比另一种方法慢,但它们都是相对的.处理图像的程序肯定不会注意到生成hashsum的微秒过程.
关于碰撞,在大多数情况下,这也是无关紧要的.即使像MD5这样的"过时"方法在大多数情况下仍然非常有用.仅当系统的安全性依赖于防止冲突时,才建议不要使用它.
Jon*_*upp 15
Rex M关于使用SHA1生成哈希的答案部分很好(MD5也是一个很受欢迎的选项).zvolkov关于不经常创建新的加密提供程序的建议也是一个很好的建议(如果速度比实际保证的唯一性更重要的话,建议使用CRC.
不过,千万不能使用Encoding.UTF8.GetString()到一个byte []转换为字符串(当然,除非你从上下文中知道,它是有效的UTF8).首先,它将拒绝无效的surogates.保证始终为byte []提供有效字符串的方法是Convert.ToBase64String().
每次需要计算哈希值时创建SHA1CryptoServiceProvider的新实例都不是很快.使用相同的实例非常快.
我仍然宁愿做多种CRC算法中的一种而不是加密散列,因为为加密设计的散列函数对于非常小的散列大小(32位)不能很好地工作,这是你想要的GetHash()覆盖(假设这是你想要的).
有关在C#中计算CRC的一个示例,请查看此链接:http://sanity-free.org/134/standard_crc_16_in_csharp.html
PS你希望你的哈希值小(16或32位)的原因是你可以快速比较它们(这是哈希的整点,还记得吗?).由编码为字符串的256位长值表示的哈希在性能方面非常疯狂.