C#为字节数组或图像创建哈希

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这样的"过时"方法在大多数情况下仍然非常有用.仅当系统的安全性依赖于防止冲突时,才建议不要使用它.

  • @Scike0xff在软件中我们说"独特"时,它被理解为"足够独特".我没有看到任何迹象表明此线程中的任何人对此感到困惑. (4认同)
  • Rex我确定你知道这一点,但正如@AdamRobinson所说,没有哈希(包括像.NET1这样的.NET加密哈希)可以确保唯一性; 只要哈希是多对一映射,即如果可能的哈希码少于可能的输入,则不是这样. (3认同)
  • 我关注的不仅仅是那些发帖的人,而是所有读过的人,我认为如果他们感到困惑,你一定不会看到任何迹象.我认为你的意思是"我希望它会被理解为",因为这不是字典中的定义,也不是我的意思或理解它.也许你可以引用一个有信誉的来源? (2认同)
  • @ Spike0xff无论如何,在人类的一生中绝对没有机会任何软件都会偶然发现两个相同的128位哈希值.因此,我认为"除非有人破解算法,否则这是独一无二的". (2认同)
  • @CamiloMartin即使在你发布的时候,这已经不是真的了:http://www.mscs.dal.ca/~selinger/md5collision/ (2认同)

Jon*_*upp 15

Rex M关于使用SHA1生成哈希的答案部分很好(MD5也是一个很受欢迎的选项).zvolkov关于不经常创建新的加密提供程序的建议也是一个很好的建议(如果速度比实际保证的唯一性更重要的话,建议使用CRC.

不过,千万不能使用Encoding.UTF8.GetString()到一个byte []转换为字符串(当然,除非你从上下文中知道,它是有效的UTF8).首先,它将拒绝无效的surogates.保证始终为byte []提供有效字符串的方法是Convert.ToBase64String().


zvo*_*kov 5

每次需要计算哈希值时创建SHA1CryptoServiceProvider的新实例都不是很快.使用相同的实例非常快.

我仍然宁愿做多种CRC算法中的一种而不是加密散列,因为为加密设计的散列函数对于非常小的散列大小(32位)不能很好地工作,这是你想要的GetHash()覆盖(假设这是你想要的).

有关在C#中计算CRC的一个示例,请查看此链接:http://sanity-free.org/134/standard_crc_16_in_csharp.html

PS你希望你的哈希值小(16或32位)的原因是你可以快速比较它们(这是哈希的整点,还记得吗?).由编码为字符串的256位长值表示的哈希在性能方面非常疯狂.