From 632b11ef2b3a5400f29caf5f49bcd20051bf342a Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Sun, 24 Mar 2024 18:35:04 -0400 Subject: [PATCH] Correctly label CRC64 implementations, extend to old .NET --- SabreTools.Hashing.Test/HashToolTests.cs | 20 +++++--------------- SabreTools.Hashing/HashType.cs | 8 +++----- SabreTools.Hashing/HashWrapper.cs | 9 ++++++++- 3 files changed, 16 insertions(+), 21 deletions(-) diff --git a/SabreTools.Hashing.Test/HashToolTests.cs b/SabreTools.Hashing.Test/HashToolTests.cs index 0da0b86..cb3d08f 100644 --- a/SabreTools.Hashing.Test/HashToolTests.cs +++ b/SabreTools.Hashing.Test/HashToolTests.cs @@ -18,10 +18,8 @@ namespace SabreTools.Hashing.Test private const string _crc16_ccitt = "482d"; private const string _crc16_ibm = "7573"; private const string _crc32 = "ba02a660"; -#if NET462_OR_GREATER || NETCOREAPP private const string _crc64 = "a0e0009c18b5338d"; -#endif - private const string _crc64_ecma = "fb49044e8331f6e5"; + private const string _crc64_reversed = "fb49044e8331f6e5"; private const string _fletcher16 = "46c1"; private const string _fletcher32 = "073f2d94"; private const string _md5 = "b722871eaa950016296184d026c5dec9"; @@ -71,10 +69,8 @@ namespace SabreTools.Hashing.Test Assert.Equal(_crc32, hashDict[HashType.CRC32_Naive]); Assert.Equal(_crc32, hashDict[HashType.CRC32_Optimized]); Assert.Equal(_crc32, hashDict[HashType.CRC32_Parallel]); -#if NET462_OR_GREATER || NETCOREAPP Assert.Equal(_crc64, hashDict[HashType.CRC64]); -#endif - Assert.Equal(_crc64_ecma, hashDict[HashType.CRC64_ECMA]); + Assert.Equal(_crc64_reversed, hashDict[HashType.CRC64_Reversed]); Assert.Equal(_fletcher16, hashDict[HashType.Fletcher16]); Assert.Equal(_fletcher32, hashDict[HashType.Fletcher32]); Assert.Equal(_md5, hashDict[HashType.MD5]); @@ -112,10 +108,8 @@ namespace SabreTools.Hashing.Test Assert.Equal(_crc32, hashDict[HashType.CRC32_Naive]); Assert.Equal(_crc32, hashDict[HashType.CRC32_Optimized]); Assert.Equal(_crc32, hashDict[HashType.CRC32_Parallel]); -#if NET462_OR_GREATER || NETCOREAPP Assert.Equal(_crc64, hashDict[HashType.CRC64]); -#endif - Assert.Equal(_crc64_ecma, hashDict[HashType.CRC64_ECMA]); + Assert.Equal(_crc64_reversed, hashDict[HashType.CRC64_Reversed]); Assert.Equal(_fletcher16, hashDict[HashType.Fletcher16]); Assert.Equal(_fletcher32, hashDict[HashType.Fletcher32]); Assert.Equal(_md5, hashDict[HashType.MD5]); @@ -150,10 +144,8 @@ namespace SabreTools.Hashing.Test Assert.Equal(_crc32, hashDict[HashType.CRC32_Naive]); Assert.Equal(_crc32, hashDict[HashType.CRC32_Optimized]); Assert.Equal(_crc32, hashDict[HashType.CRC32_Parallel]); -#if NET462_OR_GREATER || NETCOREAPP Assert.Equal(_crc64, hashDict[HashType.CRC64]); -#endif - Assert.Equal(_crc64_ecma, hashDict[HashType.CRC64_ECMA]); + Assert.Equal(_crc64_reversed, hashDict[HashType.CRC64_Reversed]); Assert.Equal(_fletcher16, hashDict[HashType.Fletcher16]); Assert.Equal(_fletcher32, hashDict[HashType.Fletcher32]); Assert.Equal(_md5, hashDict[HashType.MD5]); @@ -188,10 +180,8 @@ namespace SabreTools.Hashing.Test Assert.Equal(_crc32, hashDict[HashType.CRC32_Naive]); Assert.Equal(_crc32, hashDict[HashType.CRC32_Optimized]); Assert.Equal(_crc32, hashDict[HashType.CRC32_Parallel]); -#if NET462_OR_GREATER || NETCOREAPP Assert.Equal(_crc64, hashDict[HashType.CRC64]); -#endif - Assert.Equal(_crc64_ecma, hashDict[HashType.CRC64_ECMA]); + Assert.Equal(_crc64_reversed, hashDict[HashType.CRC64_Reversed]); Assert.Equal(_fletcher16, hashDict[HashType.Fletcher16]); Assert.Equal(_fletcher32, hashDict[HashType.Fletcher32]); Assert.Equal(_md5, hashDict[HashType.MD5]); diff --git a/SabreTools.Hashing/HashType.cs b/SabreTools.Hashing/HashType.cs index 023f268..a014996 100644 --- a/SabreTools.Hashing/HashType.cs +++ b/SabreTools.Hashing/HashType.cs @@ -53,17 +53,15 @@ namespace SabreTools.Hashing /// CRC32_Parallel, -#if NET462_OR_GREATER || NETCOREAPP /// - /// CRC 64-bit checksum + /// CRC 64-bit checksum (0x42F0E1EBA9EA3693 polynomial) /// CRC64, -#endif /// - /// CRC 64-bit checksum (ECMA implementation) + /// CRC 64-bit checksum (0xC96C5795D7870F42 polynomial) /// - CRC64_ECMA, + CRC64_Reversed, /// /// John G. Fletcher's 16-bit checksum diff --git a/SabreTools.Hashing/HashWrapper.cs b/SabreTools.Hashing/HashWrapper.cs index 5169885..ad03128 100644 --- a/SabreTools.Hashing/HashWrapper.cs +++ b/SabreTools.Hashing/HashWrapper.cs @@ -76,6 +76,11 @@ namespace SabreTools.Hashing /// May be either a HashAlgorithm or NonCryptographicHashAlgorithm private object? _hasher; + /// + /// Non-reversed CRC-64 polynomial + /// + private const ulong CRC64_ECMA_POLY_NORMAL = 0x42F0E1EBA9EA3693; + #endregion #region Constructors @@ -114,8 +119,10 @@ namespace SabreTools.Hashing HashType.CRC32_Parallel => new ParallelCRC(), #if NET462_OR_GREATER || NETCOREAPP HashType.CRC64 => new Crc64(), +#else + HashType.CRC64 => new Crc64Context(CRC64_ECMA_POLY_NORMAL, 0xFFFFFFFFFFFFFFFF), #endif - HashType.CRC64_ECMA => new Crc64Context(), + HashType.CRC64_Reversed => new Crc64Context(), HashType.Fletcher16 => new Fletcher16Context(), HashType.Fletcher32 => new Fletcher32Context(), HashType.MD5 => MD5.Create(),