计算md5哈希

Cna*_*eak 0 .net c# 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;
}
Run Code Online (Sandbox Code Playgroud)

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

    var v1 = GetMD5("C:\\test.mp4");
    var v2 = GetMD5("C:\\test.mp4");
Run Code Online (Sandbox Code Playgroud)

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

And*_*tan 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);  
    }
  }
}  
Run Code Online (Sandbox Code Playgroud)

我已经将代码更改为使用usings.


Ste*_*eef 5

HMACMD5构造函数doc:

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

使用此构造函数,将使用64字节随机生成的密钥.

(强调我的)

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

你可能想用 System.Security.Cryptography.MD5Cng