Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#为字节数组或图像创建哈希_C#_.net_Image_Hash - Fatal编程技术网

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

C#为字节数组或图像创建哈希,c#,.net,image,hash,C#,.net,Image,Hash,可能重复: 在C#中,我需要创建图像的散列,以确保它在存储中是唯一的 我可以轻松地将其转换为字节数组,但不确定如何从那里继续 在.NET framework中是否有任何类可以帮助我,或者是否有人知道一些有效的算法来创建这样一个唯一的哈希?在.NET中有很多哈希和提供程序可以创建加密哈希-这可以满足您的条件,即它们是唯一的(大多数情况下是防冲突的)。它们都非常快,哈希肯定不会成为你应用程序的瓶颈,除非你做了一万亿次 我个人喜欢SHA1: public static string GetHashS

可能重复:

在C#中,我需要创建图像的散列,以确保它在存储中是唯一的

我可以轻松地将其转换为字节数组,但不确定如何从那里继续


在.NET framework中是否有任何类可以帮助我,或者是否有人知道一些有效的算法来创建这样一个唯一的哈希?

在.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已被黑客攻击,因此不应用于安全),但速度也较慢。

每次需要计算哈希时创建SHA1CryptoServiceProvider的新实例一点也不快。使用相同的实例非常快

尽管如此,我还是宁愿使用许多CRC算法中的一种,而不是加密哈希,因为为加密设计的哈希函数对于非常小的哈希大小(32位)来说效果不太好,而这正是您的GetHash()覆盖所需要的(假设这正是您想要的)

请查看此链接,了解在C#中计算CRC的一个示例:

另外,您希望哈希值小(16或32位)的原因是为了能够快速比较它们(这就是使用哈希值的全部意义,记得吗?)。将一个256位长的值编码为字符串来表示散列在性能上是非常愚蠢的。

关于使用SHA1生成散列的部分是一个很好的部分(MD5也是一个流行的选项)。zvolkov关于不要不断创建新的加密提供者的建议也是一个很好的建议(如果速度比实际保证的唯一性更重要,那么使用CRC也是一个很好的建议)


但是,不要使用将字节[]转换为字符串(当然,除非您从上下文中知道它是有效的UTF8)。首先,它会。一个保证始终从字节[]中为您提供有效字符串的方法是。

谢谢,你说得很对。事实上,我一直都是这么做的,但我从头顶上扔掉了那个样本,对脑海中出现的字符串做了第一个字节[]。谢谢你的提醒Jonathan,谢谢你编辑RexRex,我相信你知道这一点,但正如@AdamRobinson所说的,没有散列(包括.NET加密散列,如SHA1)可以确保唯一性;只要散列是多对一映射,即如果可能的散列码少于可能的输入,则可以确保唯一性。在软件中,当我们说“唯一”时,可以理解为“足够唯一”.我看不出有任何迹象表明,这条帖子中的任何人对此感到困惑。我关心的不仅仅是那些发帖的人,还有所有阅读的人,我认为如果他们感到困惑,你不一定会看到任何迹象。我想你的意思是“我希望大家能理解我的意思”因为这不是字典中的定义,也不是我的意思或理解方式。也许你可以引用一个著名的来源?@Spike0xff无论如何,在人类的一生中,任何软件都绝对不可能偶然发现两个相同的128位哈希值。所以想一想也没关系“除非有人破解算法,否则这是独一无二的”。@CamiloMartin即使在你发帖的时候,这也不是真的: