我正在计算文件的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值,它们是不同的!! 这是为什么 ?
这是因为你正在使用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.
HMACMD5是一种键控哈希算法,它是从MD5哈希函数构造的,并用作基于哈希的消息认证码(HMAC).HMAC进程将密钥与消息数据混合,使用散列函数散列结果,再次将该散列值与密钥混合,然后第二次应用散列函数.输出散列的长度为128位.
使用此构造函数,将使用64字节随机生成的密钥.
(强调我的)
每次调用时GetMD5(),您都会生成一个新的随机密钥.
你可能想用 System.Security.Cryptography.MD5Cng