计算md5哈希

时间:2012-03-30 12:58:11

标签: c# .net hash md5

我正在计算文件的md5hash以检查是否相同,所以我写了以下

private static byte[] GetMD5(string p)
{
    FileStream fs = new FileStream(p, FileMode.Open);
    HashAlgorithm alg = new HMACMD5();
    byte[] hashValue = alg.ComputeHash(fs);
    fs.Close();
    return hashValue;
}

并测试是否一开始我称之为

    var v1 = GetMD5("C:\\test.mp4");
    var v2 = GetMD5("C:\\test.mp4");

从调试器我列出了v1和v2值,它们是不同的!那是为什么?

5 个答案:

答案 0 :(得分:6)

这是因为您使用的是HMACMD5,一种键控哈希算法,它将键与输入组合以产生哈希值。当你通过它的默认构造函数创建HMACMD5时,它每次都会使用一个随机密钥,因此哈希值总是不同。

您需要使用MD5

private static byte[] GetMD5(string p)  
{  
  using(var fs = new FileStream(p, FileMode.Open))
  {
    using(var alg = new MD5CryptoServiceProvider())
    {
      return alg.ComputeHash(fs);  
    }
  }
}  

我已将代码更改为使用using

答案 1 :(得分:5)

来自HMACMD5 constructor doc

  

HMACMD5是一种键控哈希算法,由...构造   MD5哈希函数,用作基于哈希的消息验证码   (HMAC)。 HMAC进程将密钥与消息数据混合,   使用哈希函数散列结果,将哈希值与哈希值混合   再次使用密钥,然后再应用哈希函数   时间。输出散列的长度为128位。

     

使用此构造函数,将使用64字节随机生成的键。

(强调我的)

每次调用GetMD5(),您都会生成一个新的随机密钥。

您可能想要使用System.Security.Cryptography.MD5Cng

答案 2 :(得分:2)

此链接非常有用:Calculate MD5 Checksum for a File

答案 3 :(得分:1)

我的猜测是你做了类似的事情:

Console.WriteLine(v1);
Console.WriteLine(v2);

Console.WriteLine(v1 == v2);

这只是表明变量值引用了不同的数组 - 它没有说明这些数组中的值

相反,试试这个(打印出十六进制):

Console.WriteLine(BitConverter.ToString(v1));
Console.WriteLine(BitConverter.ToString(v2))

答案 4 :(得分:0)

使用 ToString()方法获取数组字节的值