每次C#,相同的未更改文件的MD5文件哈希都不同

时间:2009-08-28 15:48:16

标签: hash md5

晚上好,

我一直在使用C#中的MD5工具来获取文件,浏览我的Hasher类并将结果弹出数据库,以及文件名和目录。

我遇到的问题是,每次运行测试时,相同文件的MD5结果,即以任何方式保持不变都是完全不同的。

以下是我使用的代码

HashAlgorithm hmacMd5 = new HMACMD5(); 
byte[] hash;
try
{
    using (Stream fileStream = new FileStream(fileLocation, FileMode.Open))
    {
        using (Stream bufferedStream = new BufferedStream(fileStream, 5600000))
        {
            hash = hmacMd5.ComputeHash(bufferedStream);
            foreach (byte x in hash)
            {
                md5Result += x;
            }
        }
    }
}
catch (UnauthorizedAccessException uae) { }

return md5Result;

以下是hello.mp2的3次单独运行的结果:

  

1401401571161052548110297623915056204169177

     

16724366215610475211823021169211793421

     

56154777074212779619017828183239971

非常令人费解。 关于为什么我得到这些结果的唯一理性思考是将字节连接到字符串。

有人能在这里发现问题吗?

此致

里克

3 个答案:

答案 0 :(得分:14)

您应该使用System.Security.Cryptography.MD5

HMACMD5不计算哈希值,它会计算消息身份验证代码。

  

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

由于您没有提供HMAC密钥,因此代表您随机生成一个密钥,并使您看到不同的结果。

答案 1 :(得分:0)

我的建议是你不计算MD5哈希,因为MD5产生32个十六进制数的固定长度输出

另外,既然你没有看到从0xA到0xF的任何数字是非常令人费解的

您可能希望使用online MD5 calculators such as this one

检查“真实”结果

答案 2 :(得分:-2)

你之间不应该有一个bufferedStream。我猜每次运行都会缓冲不同数量的字节。