在C#中计算文件内容的哈希值?

11

我需要在C#中计算文件内容的哈希值,这样我就可以在我的应用程序中比较两个文件的哈希值。我已经进行了搜索但没有找到。

2个回答

27

您可以使用 MD5CryptoServiceProvider,它可以用于文本文件和二进制文件。

byte[] myFileData = File.ReadAllBytes(myFileName);
byte[] myHash = MD5.Create().ComputeHash(myFileData);

或者...如果您使用大文件并且不想将整个文件加载到内存中:

byte[] myHash;
using (var md5 = MD5.Create())
using (var stream = File.OpenRead(myFileName))
    myHash = md5.ComputeHash(stream);
您可以使用Enumerable.SequenceEqual来比较两个文件的字节数组:
myHash1.SequenceEqual(myHash2); 

你也可以尝试创建一个 CRC 计算器。参见:http://damieng.com/blog/2006/08/08/calculating_crc32_in_c_and_net


1
需要将整个文件转换为字节数组吗? - svick
@MartinMulder,我可以使用字典来存储哈希值,并通过TryGetValue进行比较吗?)) 哈希的哈希)) - Admiral Land
@MartinMulder,嗯...它不能与字典一起使用... - Admiral Land
@AdmiralLand:我认为你的问题完全不相关。你的问题是关于在字典中使用字节数组作为键。也许你可以创建一个新的问题。 - Martin Mulder
如何获取字节的字符串值? - Europa

9
你应该更好地搜索;)
using System.IO;
using System.Text;
using System.Security.Cryptography;


protected string GetMD5HashFromFile(string fileName)
{
  FileStream file = new FileStream(fileName, FileMode.Open);
  MD5 md5 = new MD5CryptoServiceProvider();
  byte[] retVal = md5.ComputeHash(file);
  file.Close();

  StringBuilder sb = new StringBuilder();
  for (int i = 0; i < retVal.Length; i++)
  {
    sb.Append(retVal[i].ToString("x2"));
  }
  return sb.ToString();
}

像这样将您的文件传递给此函数。

GetMD5HashFromFile("text1.txt");
GetMD5HashFromFile("text2.txt");

1
需要将整个字节数组转换为字符串吗?仅仅是比较两个哈希值似乎有点过于繁琐了。 - Martin Mulder
2
你应该在流上使用using而不是显式调用Close() - svick

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接