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: