当前位置: 首页 > 工具软件 > FileMD5Hash > 使用案例 >

MD5 哈希算法:计算文件路径和文件内容hash值

公良同
2023-12-01

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 方法返回的是计算结果的字节数组。

 类似资料: