前言
CRC-32 算法一般用作通信数据的校验,比如文件校验、数字签名等,相对于 MD5 哈希算法来说,CRC 的计算效率很高,MD5 较慢,且MD5主要用于安全领域。
PS:本人有幸在大文件分片上传场景中使用了 CRC 值进行文件校验。
正文
在 .NET 7 中,我们可以通过 Nuget 引入 System.IO.Hashing 包,使用其提供的 Crc32 类来实现,如下:
using System.IO.Hashing;
/// <summary>
/// Hash 加密
/// </summary>
public class HashEncryption
{
/// <summary>
/// 使用 CRC-32 算法计算哈希
/// </summary>
/// <param name="bytes"></param>
/// <param name="uppercase"></param>
/// <returns></returns>
public static string Crc32Encrypt(byte[] bytes, bool uppercase = false)
{
var hashBytes = Crc32.Hash(bytes);
var reverseHashBytes = hashBytes.Reverse();
return reverseHashBytes.ToHexString(uppercase);
}
/// <summary>
/// 使用 CRC-32 算法计算哈希
/// </summary>
/// <param name="stream"></param>
/// <param name="uppercase"></param>
/// <returns></returns>
public static string Crc32Encrypt(Stream stream, bool uppercase = false)
{
var crc = new Crc32();
crc.Append(stream);
var hashBytes = crc.GetHashAndReset();
var reverseHashBytes = hashBytes.Reverse();
return hashBytes.ToHexString(uppercase);
}
/// <summary>
/// 使用 CRC-32 算法计算哈希
/// </summary>
/// <param name="stream"></param>
/// <param name="uppercase"></param>
/// <returns></returns>
public static async ValueTask<string> Crc32EncryptAsync(Stream stream, bool uppercase = false)
{
var crc = new Crc32();
await crc.AppendAsync(stream);
var hashBytes = crc.GetHashAndReset();
var reverseHashBytes = hashBytes.Reverse();
return hashBytes.ToHexString(uppercase);
}
}
我将完整代码上传到了 Gitee 上,各位可自取