From 83f008919c1950743d0fd4216d0fd8822948c451 Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Mon, 11 Nov 2024 01:57:08 -0500 Subject: [PATCH] Generalize Fletcher base class for all checksums --- SabreTools.Hashing/Checksum/Adler32.cs | 24 ++++----------- .../Checksum/{Fletcher.cs => ChecksumBase.cs} | 8 ++--- SabreTools.Hashing/Checksum/Crc.cs | 28 +++++------------ SabreTools.Hashing/Checksum/Fletcher16.cs | 2 +- SabreTools.Hashing/Checksum/Fletcher32.cs | 2 +- SabreTools.Hashing/Checksum/Fletcher64.cs | 2 +- SabreTools.Hashing/HashWrapper.cs | 30 ++++--------------- 7 files changed, 26 insertions(+), 70 deletions(-) rename SabreTools.Hashing/Checksum/{Fletcher.cs => ChecksumBase.cs} (88%) diff --git a/SabreTools.Hashing/Checksum/Adler32.cs b/SabreTools.Hashing/Checksum/Adler32.cs index a78202b..f925673 100644 --- a/SabreTools.Hashing/Checksum/Adler32.cs +++ b/SabreTools.Hashing/Checksum/Adler32.cs @@ -4,13 +4,8 @@ using static SabreTools.Hashing.Checksum.Constants; namespace SabreTools.Hashing.Checksum { /// - public class Adler32 + public class Adler32 : ChecksumBase { - /// - /// The current value of the hash - /// - private uint _hash; - public Adler32() { Reset(); @@ -19,18 +14,13 @@ namespace SabreTools.Hashing.Checksum /// /// Reset the internal hashing state /// - public void Reset() + public override void Reset() { _hash = 1; } - /// - /// Hash a block of data and append it to the existing hash - /// - /// Byte array representing the data - /// Offset in the byte array to include - /// Length of the data to hash - public void TransformBlock(byte[] data, int offset, int length) + /// + public override void TransformBlock(byte[] data, int offset, int length) { // Split Adler-32 into component sums uint sum2 = (_hash >> 16) & 0xffff; @@ -140,10 +130,8 @@ namespace SabreTools.Hashing.Checksum _hash |= sum2 << 16; } - /// - /// Finalize the hash and return as a byte array - /// - public byte[] Finalize() + /// + public override byte[] Finalize() { return BitConverter.GetBytes(_hash); } diff --git a/SabreTools.Hashing/Checksum/Fletcher.cs b/SabreTools.Hashing/Checksum/ChecksumBase.cs similarity index 88% rename from SabreTools.Hashing/Checksum/Fletcher.cs rename to SabreTools.Hashing/Checksum/ChecksumBase.cs index c4d58b7..e418c96 100644 --- a/SabreTools.Hashing/Checksum/Fletcher.cs +++ b/SabreTools.Hashing/Checksum/ChecksumBase.cs @@ -5,7 +5,7 @@ namespace SabreTools.Hashing.Checksum /// /// Common base class for Fletcher checksums /// - public abstract class Fletcher + public abstract class ChecksumBase { /// /// Hash a block of data and append it to the existing hash @@ -22,9 +22,9 @@ namespace SabreTools.Hashing.Checksum } /// - /// Common base class for Fletcher checksums + /// Common base class for checksums /// - public abstract class Fletcher : Fletcher where T : struct + public abstract class ChecksumBase : ChecksumBase where T : struct { /// /// The current value of the hash @@ -34,7 +34,7 @@ namespace SabreTools.Hashing.Checksum /// /// Reset the internal hashing state /// - public void Reset() + public virtual void Reset() { _hash = default; } diff --git a/SabreTools.Hashing/Checksum/Crc.cs b/SabreTools.Hashing/Checksum/Crc.cs index 2029d59..c019fd4 100644 --- a/SabreTools.Hashing/Checksum/Crc.cs +++ b/SabreTools.Hashing/Checksum/Crc.cs @@ -3,7 +3,7 @@ using static SabreTools.Hashing.HashOperations; namespace SabreTools.Hashing.Checksum { - public class Crc + public class Crc : ChecksumBase { /// /// Definition used to create the runner @@ -15,11 +15,6 @@ namespace SabreTools.Hashing.Checksum /// private readonly CrcTable _table; - /// - /// The current value of the hash - /// - private ulong _hash; - public Crc(CrcDefinition def) { // Check for a valid bit width @@ -31,27 +26,18 @@ namespace SabreTools.Hashing.Checksum _hash = def.ReflectIn ? ReverseBits(def.Init, def.Width) : def.Init; } - /// - /// Reset the internal hashing state - /// - public void Reset() + /// + public override void Reset() { _hash = Def.Init; } - /// - /// Hash a block of data and append it to the existing hash - /// - /// Byte array representing the data - /// Offset in the byte array to include - /// Length of the data to hash - public void TransformBlock(byte[] data, int offset, int length) + /// + public override void TransformBlock(byte[] data, int offset, int length) => _table.TransformBlock(ref _hash, data, offset, length); - /// - /// Finalize the hash and return as a byte array - /// - public byte[] Finalize() + /// + public override byte[] Finalize() { // Create a copy of the hash ulong localHash = _hash; diff --git a/SabreTools.Hashing/Checksum/Fletcher16.cs b/SabreTools.Hashing/Checksum/Fletcher16.cs index dfb42ba..6ffee90 100644 --- a/SabreTools.Hashing/Checksum/Fletcher16.cs +++ b/SabreTools.Hashing/Checksum/Fletcher16.cs @@ -1,7 +1,7 @@ namespace SabreTools.Hashing.Checksum { /// - public class Fletcher16 : Fletcher + public class Fletcher16 : ChecksumBase { public Fletcher16() { diff --git a/SabreTools.Hashing/Checksum/Fletcher32.cs b/SabreTools.Hashing/Checksum/Fletcher32.cs index 06523a9..7d7bd07 100644 --- a/SabreTools.Hashing/Checksum/Fletcher32.cs +++ b/SabreTools.Hashing/Checksum/Fletcher32.cs @@ -4,7 +4,7 @@ namespace SabreTools.Hashing.Checksum { /// /// Uses an Adler-32-like implementation instead of the above - public class Fletcher32 : Fletcher + public class Fletcher32 : ChecksumBase { public Fletcher32() { diff --git a/SabreTools.Hashing/Checksum/Fletcher64.cs b/SabreTools.Hashing/Checksum/Fletcher64.cs index 3915c10..2dfb5a9 100644 --- a/SabreTools.Hashing/Checksum/Fletcher64.cs +++ b/SabreTools.Hashing/Checksum/Fletcher64.cs @@ -4,7 +4,7 @@ namespace SabreTools.Hashing.Checksum { /// /// Uses an Adler-32-like implementation instead of the above - public class Fletcher64 : Fletcher + public class Fletcher64 : ChecksumBase { public Fletcher64() { diff --git a/SabreTools.Hashing/HashWrapper.cs b/SabreTools.Hashing/HashWrapper.cs index fd29fbe..6de8fbd 100644 --- a/SabreTools.Hashing/HashWrapper.cs +++ b/SabreTools.Hashing/HashWrapper.cs @@ -34,20 +34,10 @@ namespace SabreTools.Hashing { switch (_hasher) { - case Adler32 a32: - var a32Arr = a32.Finalize(); - Array.Reverse(a32Arr); - return a32Arr; - - case Crc cr: - var crArr = cr.Finalize(); - Array.Reverse(crArr); - return crArr; - - case Fletcher fc: - var fcArr = fc.Finalize(); - Array.Reverse(fcArr); - return fcArr; + case ChecksumBase cb: + var cbArr = cb.Finalize(); + Array.Reverse(cbArr); + return cbArr; case HashAlgorithm ha: return ha.Hash; @@ -359,16 +349,8 @@ namespace SabreTools.Hashing { switch (_hasher) { - case Adler32 a32: - a32.TransformBlock(buffer, offset, size); - break; - - case Crc cr: - cr.TransformBlock(buffer, offset, size); - break; - - case Fletcher fc: - fc.TransformBlock(buffer, offset, size); + case ChecksumBase cb: + cb.TransformBlock(buffer, offset, size); break; case HashAlgorithm ha: