1.MD5.TransformBlock 是一种常见的哈希算法,可以将任意长度的输入数据计算为一个 128 位的哈希值。TransformBlock 方法将输入缓冲区中的字节块添加到 MD5 算法的内部状态中,但并不计算哈希值。通常,需要对整个输入数据调用 TransformBlock 方法,然后再调用 TransformFinalBlock 方法来计算哈希值。
public static byte[] CreateMd5ForFiles(List<string> paths)
{
var md5 = MD5.Create();
for (int i = 0; i < paths.Count; i++)
{
string file = paths[i];
// hash path
byte[] pathBytes = Encoding.UTF8.GetBytes(file.ToLower());
md5.TransformBlock(pathBytes, 0, pathBytes.Length, pathBytes, 0);
// hash contents
byte[] contentBytes = File.ReadAllBytes(file);
if (i == paths.Count - 1)
md5.TransformFinalBlock(contentBytes, 0, contentBytes.Length);
else
md5.TransformBlock(contentBytes, 0, contentBytes.Length, contentBytes, 0);
}
return md5.Hash; // 16位
}
2.把原文件md5file中的内容替换为上面函数返回的hash值 currentMd5:
var md5Bytes = File.ReadAllBytes(md5File);
unsafe
{
fixed (byte* p1 = md5Bytes)
fixed (byte* p2 = currentMd5)
{
return UnsafeUtility.MemCmp(p1, p2, md5len) != 0;
}
}
3.MD5 ComputeHash 是一种常见的哈希算法,可以将任意长度的输入数据计算为一个 128 位的哈希值。ComputeHash 方法将整个输入数据计算为哈希值,不需要先调用 TransformBlock 方法。
ComputeHash 方法有多个重载,其中最常用的重载使用一个字节数组作为输入,并返回一个字节数组作为哈希值
using System.Security.Cryptography;
string inputString = "Hello, world!";
byte[] inputBytes = Encoding.UTF8.GetBytes(inputString);
// 创建 MD5 哈希算法对象
MD5 md5 = MD5.Create();
// 计算哈希值
byte[] hash = md5.ComputeHash(inputBytes);
4.
MD5 TransformBlock 方法用于将输入数据分块处理,并将分块处理的结果存储在哈希算法的状态中。它通常与 MD5 TransformFinalBlock 方法一起使用,用于将最后一个数据块处理完成并计算哈希值。在使用 TransformBlock 方法时,需要多次调用该方法,并将每个数据块作为参数传递,最后再调用 TransformFinalBlock 方法,将最后一个数据块作为参数传递,并计算哈希值。这种方式适用于较大的输入数据,可以在处理数据的同时计算哈希值。
MD5 ComputeHash 方法则更适用于较小的输入数据,它可以一次性将所有数据计算为哈希值,并返回计算结果。在使用 ComputeHash 方法时,不需要将输入数据分块处理,也不需要使用 TransformFinalBlock 方法。
另外,MD5 TransformBlock 方法和 MD5 TransformFinalBlock 方法返回的是布尔类型的值,表示操作是否成功完成,而 MD5 ComputeHash 方法返回的是计算结果的字节数组。