晚上好,
我一直在使用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
非常令人费解。 关于为什么我得到这些结果的唯一理性思考是将字节连接到字符串。
有人能在这里发现问题吗?
此致
里克
答案 0 :(得分:14)
您应该使用System.Security.Cryptography.MD5。
HMACMD5不计算哈希值,它会计算消息身份验证代码。
HMACMD5是一种键控哈希 从...构造的算法 MD5哈希函数用作 基于哈希的消息认证码 (HMAC)。 HMAC流程混合了一个 密钥与消息数据, 使用哈希散列结果 函数,混合哈希值 再次使用密钥,然后应用 哈希函数第二次。该 输出散列的长度为128位
由于您没有提供HMAC密钥,因此代表您随机生成一个密钥,并使您看到不同的结果。
答案 1 :(得分:0)
我的建议是你不计算MD5哈希,因为MD5产生32个十六进制数的固定长度输出
另外,既然你没有看到从0xA到0xF的任何数字是非常令人费解的
检查“真实”结果答案 2 :(得分:-2)
你之间不应该有一个bufferedStream。我猜每次运行都会缓冲不同数量的字节。