Gapotchenko.FX.Data.Integrity.Checksum.Crc32
2024.1.3
Prefix Reserved
dotnet add package Gapotchenko.FX.Data.Integrity.Checksum.Crc32 --version 2024.1.3
NuGet\Install-Package Gapotchenko.FX.Data.Integrity.Checksum.Crc32 -Version 2024.1.3
<PackageReference Include="Gapotchenko.FX.Data.Integrity.Checksum.Crc32" Version="2024.1.3" />
paket add Gapotchenko.FX.Data.Integrity.Checksum.Crc32 --version 2024.1.3
#r "nuget: Gapotchenko.FX.Data.Integrity.Checksum.Crc32, 2024.1.3"
// Install Gapotchenko.FX.Data.Integrity.Checksum.Crc32 as a Cake Addin #addin nuget:?package=Gapotchenko.FX.Data.Integrity.Checksum.Crc32&version=2024.1.3 // Install Gapotchenko.FX.Data.Integrity.Checksum.Crc32 as a Cake Tool #tool nuget:?package=Gapotchenko.FX.Data.Integrity.Checksum.Crc32&version=2024.1.3
Overview
The module provides the implementation of checksum algorithms belonging to the CRC-32 family.
Quick Start
Use the following code to calculate a CRC-32 checksum for the specified data, be it System.Byte[]
, System.ReadOnlySpan<Byte>
or System.IO.Stream
:
using Gapotchenko.FX.Data.Integrity.Checksum;
var checksum = Crc32.Standard.ComputeChecksum(data);
If you need to calculate a CRC-32 checksum iteratively then the following approach becomes handy:
var iterator = Crc32.Standard.CreateIterator();
iterator.ComputeBlock(...); // block 1
// ...
iterator.ComputeBlock(...); // block N
// Compute the final checksum:
var checksum = iterator.ComputeFinal();
Available CRC-32 Algorithms
CRC-32 family of cyclic redundancy checks consists of several attested checksum algorithms with predefined parameters:
Algorithm | Aliases | Gapotchenko.FX Implementation | Parameters: poly | init | refin | refout | xorout | check |
---|---|---|---|---|---|---|---|---|
CRC-32 (standard, recommended) | CRC-32/ISO-HDLC, CRC-32/ADCCP, CRC-32/V-42, CRC-32/XZ, PKZIP | Crc32.Standard |
0x04c11db7 | 0xffffffff | true | true | 0xffffffff | 0xcbf43926 |
CRC-32C (hardware-accelerated, recommended) | CRC-32/BASE91-C, CRC-32/CASTAGNOLI, CRC-32/INTERLAKEN, CRC-32/ISCSI | Crc32.Attested.C |
0x1edc6f41 | 0xffffffff | true | true | 0xffffffff | 0xe3069283 |
CRC-32Q | CRC-32/AIXM | Crc32.Attested.Q |
0x814141ab | 0x00000000 | false | false | 0x00000000 | 0x3010bf7f |
CRC-32/AUTOSAR | Crc32.Attested.Autosar |
0xf4acfb13 | 0xffffffff | true | true | 0xffffffff | 0x1697d06a | |
CRC-32/POSIX | CRC-32/CKSUM, CKSUM | Crc32.Attested.Posix |
0x04c11db7 | 0x00000000 | false | false | 0xffffffff | 0x765e7680 |
CRC-32/BZIP2 | CRC-32/DECT-B, CRC-32/AAL5, B-CRC-32 | Crc32.Attested.BZip2 |
0x04c11db7 | 0xffffffff | false | false | 0xffffffff | 0xfc891918 |
CRC-32/MEF | Crc32.Attested.Mef |
0x741b8cd7 | 0xffffffff | true | true | 0x00000000 | 0xd2c22f51 | |
CRC-32/MPEG-2 | Crc32.Attested.Mpeg2 |
0x04c11db7 | 0xffffffff | false | false | 0x00000000 | 0x0376e6e7 |
The check
parameter shows what checksum value an algorithm should produce for "123456789"
input string interpreted as an ASCII data:
// Get the byte representation of the ASCII string.
var data = Encoding.ASCII.GetBytes("123456789");
// Compute the checksum.
var checksum = Crc32.Standard.ComputeChecksum(data);
// Print out the result ("Checksum=0xcbf43926" for standard CRC-32).
Console.WriteLine("Checksum=0x{0:x}", checksum);
Recommended CRC-32 Algorithms
Among all other possibilities, it is recommended to use the standard CRC-32 algorithm which comes under CRC-32, CRC-32/ISO-HDLC, CRC-32/ADCCP, CRC-32/V-42, CRC-32/XZ, PKZIP aliases and is available via Crc32.Standard
property.
Another good option is CRC-32C algorithm which is widely used in data storage and communication industries, but more importantly, it benefits from a hardware acceleration provided by modern CPUs.
The algorithm is available via Crc32.Attested.C
property.
All other predefined algorithms are available via the corresponding properties of the Crc32.Attested
class.
Custom CRC-32 Algorithms
Once in a while, you may encounter a custom CRC-32 algorithm that is neither widely known nor characterized. In that case, you can instantiate a custom checksum algorithm with the desired parameters by hand:
var checksumAlgorithm = new CustomCrc32(poly, init, refin, refout, xorout);
If you want to formalize the custom algorithm even further, you may opt in to create a separate class for it with a convenient accessor property:
/// <summary>
/// Defines a custom CRC-32 algorithm.
/// </summary>
sealed class FooCrc32 : CustomCrc32
{
FooCrc32() :
base(poly, init, refin, refout, xorout)
{
}
public static FooCrc32 Instance { get; } = new();
}
That will allow you to use the algorithm effortlessly from several places in the codebase later:
var checksum = FooCrc32.Instance.ComputeChecksum(...);
Commonly Used Types
Gapotchenko.FX.Data.Integrity.Checksum.Crc32
Other Modules
Let's continue with a look at some other modules provided by Gapotchenko.FX:
- Gapotchenko.FX
- Gapotchenko.FX.AppModel.Information
- Gapotchenko.FX.Collections
- Gapotchenko.FX.Console
- Gapotchenko.FX.Data
- Gapotchenko.FX.Diagnostics
- Gapotchenko.FX.IO
- Gapotchenko.FX.Linq
- Gapotchenko.FX.Math
- Gapotchenko.FX.Memory
- Gapotchenko.FX.Security.Cryptography
- Gapotchenko.FX.Text
- Gapotchenko.FX.Threading
- Gapotchenko.FX.Tuples
Or look at the full list of modules.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 is compatible. net5.0-windows was computed. net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 is compatible. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 is compatible. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 is compatible. netcoreapp2.2 was computed. netcoreapp3.0 is compatible. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 is compatible. |
.NET Framework | net461 is compatible. net462 was computed. net463 was computed. net47 was computed. net471 is compatible. net472 is compatible. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
-
.NETCoreApp 2.1
- Gapotchenko.FX.Data.Integrity.Checksum (>= 2024.1.3)
- Gapotchenko.FX.Numerics (>= 2024.1.3)
-
.NETCoreApp 3.0
- Gapotchenko.FX.Data.Integrity.Checksum (>= 2024.1.3)
- Gapotchenko.FX.Numerics (>= 2024.1.3)
-
.NETFramework 4.6.1
- Gapotchenko.FX.Data.Integrity.Checksum (>= 2024.1.3)
- Gapotchenko.FX.Numerics (>= 2024.1.3)
- System.ValueTuple (>= 4.5.0)
-
.NETFramework 4.7.1
- Gapotchenko.FX.Data.Integrity.Checksum (>= 2024.1.3)
- Gapotchenko.FX.Numerics (>= 2024.1.3)
-
.NETFramework 4.7.2
- Gapotchenko.FX.Data.Integrity.Checksum (>= 2024.1.3)
- Gapotchenko.FX.Numerics (>= 2024.1.3)
-
.NETStandard 2.0
- Gapotchenko.FX.Data.Integrity.Checksum (>= 2024.1.3)
- Gapotchenko.FX.Numerics (>= 2024.1.3)
-
.NETStandard 2.1
- Gapotchenko.FX.Data.Integrity.Checksum (>= 2024.1.3)
- Gapotchenko.FX.Numerics (>= 2024.1.3)
-
net5.0
- Gapotchenko.FX.Data.Integrity.Checksum (>= 2024.1.3)
- Gapotchenko.FX.Numerics (>= 2024.1.3)
-
net6.0
- Gapotchenko.FX.Data.Integrity.Checksum (>= 2024.1.3)
- Gapotchenko.FX.Numerics (>= 2024.1.3)
-
net7.0
- Gapotchenko.FX.Data.Integrity.Checksum (>= 2024.1.3)
- Gapotchenko.FX.Numerics (>= 2024.1.3)
-
net8.0
- Gapotchenko.FX.Data.Integrity.Checksum (>= 2024.1.3)
- Gapotchenko.FX.Numerics (>= 2024.1.3)
-
net9.0
- Gapotchenko.FX.Data.Integrity.Checksum (>= 2024.1.3)
- Gapotchenko.FX.Numerics (>= 2024.1.3)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.