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(),