哈希值用作表示大量数据的固定大小的唯一值。 当且仅当相应的数据也匹配时,两组数据的哈希才会匹配。 对数据的小更改会导致哈希中的大量无法预测的更改。SHA256 算法的哈希大小为256位。SHA512 算法的哈希大小为512位。本文主要介绍.NET Core(C#) 中,使用sha256和sha512算法计算文件的哈希值方法及示例代码。

1、使用sha256计算文件hash

using System;
using System.IO;
using System.Security.Cryptography;
public class HashDirectory
{
    public static void Main(String[] args)
    {
        if (args.Length < 1)
        {
            Console.WriteLine("No directory selected.");
            return;
        }
        string directory = args[0];
        if (Directory.Exists(directory))
        {
            // 创建一个表示指定目录的DirectoryInfo对象。
           var dir = new DirectoryInfo(directory);
            // 获取目录中每个文件的FileInfo对象。
            FileInfo[] files = dir.GetFiles();
            // 初始化一个SHA256哈希对象。
            using (SHA256 mySHA256 = SHA256.Create())
            {
                // 计算并打印目录中每个文件的哈希值。
                foreach (FileInfo fInfo in files)
                {
                    try { 
                        // 为文件创建一个fileStream。
                        FileStream fileStream = fInfo.Open(FileMode.Open);
                        // 确保它位于流的开头。
                        fileStream.Position = 0;
                        //计算fileStream的hash。
                        byte[] hashValue = mySHA256.ComputeHash(fileStream);
                        // 将文件的名称和散列值写入控制台。
                        Console.Write($"{fInfo.Name}: ");
                        PrintByteArray(hashValue);
                        // 关闭该文件。
                        fileStream.Close();
                    }
                    catch (IOException e) {
                        Console.WriteLine($"I/O Exception: {e.Message}");
                    }
                    catch (UnauthorizedAccessException e) {
                        Console.WriteLine($"Access Exception: {e.Message}");
                    }
                }
            }
        }
        else
        {
            Console.WriteLine("The directory specified could not be found.");
        }
    }
    // 以可读格式显示字节数组。
    public static void PrintByteArray(byte[] array)
    {
        for (int i = 0; i < array.Length; i++)
        {
            Console.Write($"{array[i]:X2}");
            if ((i % 4) == 3) Console.Write(" ");
        }
        Console.WriteLine();
    }
}

2、使用sha512计算文件hash

using System;
using System.IO;
using System.Security.Cryptography;
public class HashDirectory
{
    public static void Main(String[] args)
    {
        if (args.Length < 1)
        {
            Console.WriteLine("No directory selected.");
            return;
        }
        string directory = args[0];
        if (Directory.Exists(directory))
        {
            // 创建一个表示指定目录的DirectoryInfo对象。
           var dir = new DirectoryInfo(directory);
            // 获取目录中每个文件的FileInfo对象。
            FileInfo[] files = dir.GetFiles();
            // 初始化一个SHA512哈希对象。
            using (SHA512 mySHA512 = SHA512Managed())
            {
                // 计算并打印目录中每个文件的哈希值。
                foreach (FileInfo fInfo in files)
                {
                    try { 
                        // 为文件创建一个fileStream。
                        FileStream fileStream = fInfo.Open(FileMode.Open);
                        // 确保它位于流的开头。
                        fileStream.Position = 0;
                        //计算fileStream的hash。
                        byte[] hashValue = mySHA512.ComputeHash(fileStream);
                        // 将文件的名称和散列值写入控制台。
                        Console.Write($"{fInfo.Name}: ");
                        PrintByteArray(hashValue);
                        // 关闭该文件。
                        fileStream.Close();
                    }
                    catch (IOException e) {
                        Console.WriteLine($"I/O Exception: {e.Message}");
                    }
                    catch (UnauthorizedAccessException e) {
                        Console.WriteLine($"Access Exception: {e.Message}");
                    }
                }
            }
        }
        else
        {
            Console.WriteLine("The directory specified could not be found.");
        }
    }
    // 以可读格式显示字节数组。
    public static void PrintByteArray(byte[] array)
    {
        for (int i = 0; i < array.Length; i++)
        {
            Console.Write($"{array[i]:X2}");
            if ((i % 4) == 3) Console.Write(" ");
        }
        Console.WriteLine();
    }
}

相关文档:

.NET Core 通过扩展方法实现密码字符串加密(sha256和Sha512)

system.security.cryptography