CnativeFreak
CnativeFreak

Reputation: 714

Computing md5 hash

I am computing md5hash of files to check if identical so I wrote the following

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;
}

and to test if for the beginning I called it like

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

and from debugger I listed v1 and v2 values and they are different !! why is that ?

Upvotes: 0

Views: 2282

Answers (4)

Andras Zoltan
Andras Zoltan

Reputation: 42363

It's because you're using HMACMD5, a keyed hashing algorithm, which combines a key with the input to produce a hash value. When you create an HMACMD5 via it's default constructor, it will use a random key each time, therefore the hashes will always be different.

You need to use MD5:

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

I've changed the code to use usings as well.

Upvotes: 6

Anis H
Anis H

Reputation: 1150

Use ToString() methode to get the value of the array byte

Upvotes: 0

Steef
Steef

Reputation: 34685

From the HMACMD5 constructor doc:

HMACMD5 is a type of keyed hash algorithm that is constructed from the MD5 hash function and used as a Hash-based Message Authentication Code (HMAC). The HMAC process mixes a secret key with the message data, hashes the result with the hash function, mixes that hash value with the secret key again, and then applies the hash function a second time. The output hash will be 128 bits in length.

With this constructor, a 64-byte, randomly generated key is used.

(Emphasis mine)

With every call to GetMD5(), you're generating a new random key.

You might want to use System.Security.Cryptography.MD5Cng

Upvotes: 5

Jon Skeet
Jon Skeet

Reputation: 1503090

My guess is that you did something like:

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

or

Console.WriteLine(v1 == v2);

That just shows that the variable values refer to distinct arrays - it doesn't say anything about the values within those arrays.

Instead, try this (to print out the hex):

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

Upvotes: 1

Related Questions