我正在计算文件的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值,它们是不同的!那是为什么?
答案 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是一种键控哈希算法,由...构造 MD5哈希函数,用作基于哈希的消息验证码 (HMAC)。 HMAC进程将密钥与消息数据混合, 使用哈希函数散列结果,将哈希值与哈希值混合 再次使用密钥,然后再应用哈希函数 时间。输出散列的长度为128位。
使用此构造函数,将使用64字节随机生成的键。
(强调我的)
每次调用GetMD5()
,您都会生成一个新的随机密钥。
答案 2 :(得分:2)
答案 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()方法获取数组字节的值