CRC32算法的C#实现

523 阅读1分钟

前言

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 上,各位可自取

相关链接