diff --git a/SabreTools.Hashing/Checksum/Constants.cs b/SabreTools.Hashing/Checksum/Constants.cs index 82c4dcf..5de3b20 100644 --- a/SabreTools.Hashing/Checksum/Constants.cs +++ b/SabreTools.Hashing/Checksum/Constants.cs @@ -2,7 +2,7 @@ namespace SabreTools.Hashing.Checksum { internal static class Constants { - #region Adler-32 / Fletcher-32 + #region Adler-32 /// /// Largest prime smaller than 65536 @@ -14,6 +14,10 @@ namespace SabreTools.Hashing.Checksum /// public const ushort A32NMAX = 5552; + #endregion + + #region Fletcher-32 + /// /// Max value for a single half of a Fletcher-32 checksum /// @@ -25,15 +29,5 @@ namespace SabreTools.Hashing.Checksum public const uint F64BASE = 0xffffffff; #endregion - - #region FNV - - public const uint FNV32Basis = 0x811c9dc5; - public const ulong FNV64Basis = 0xcbf29ce484222325; - - public const uint FNV32Prime = 0x01000193; - public const ulong FNV64Prime = 0x00000100000001b3; - - #endregion } } \ No newline at end of file diff --git a/SabreTools.Hashing/Checksum/FnvBase.cs b/SabreTools.Hashing/Checksum/FnvBase.cs deleted file mode 100644 index bad90c3..0000000 --- a/SabreTools.Hashing/Checksum/FnvBase.cs +++ /dev/null @@ -1,21 +0,0 @@ -namespace SabreTools.Hashing.Checksum -{ - public abstract class FnvBase : ChecksumBase where T : struct - { - /// - /// Initial value to use - /// - protected T _basis; - - /// - /// Round prime to use - /// - protected T _prime; - - /// - public override void Initialize() - { - _hash = _basis; - } - } -} \ No newline at end of file diff --git a/SabreTools.Hashing/HashWrapper.cs b/SabreTools.Hashing/HashWrapper.cs index 63eaea5..b5e3b9f 100644 --- a/SabreTools.Hashing/HashWrapper.cs +++ b/SabreTools.Hashing/HashWrapper.cs @@ -9,6 +9,7 @@ using Aaru.CommonTypes.Interfaces; using Blake3; #endif using SabreTools.Hashing.Checksum; +using SabreTools.Hashing.NonCryptographicHash; using static SabreTools.Hashing.HashOperations; namespace SabreTools.Hashing diff --git a/SabreTools.Hashing/NonCryptographicHash/Constants.cs b/SabreTools.Hashing/NonCryptographicHash/Constants.cs new file mode 100644 index 0000000..5a1fefc --- /dev/null +++ b/SabreTools.Hashing/NonCryptographicHash/Constants.cs @@ -0,0 +1,15 @@ +namespace SabreTools.Hashing.NonCryptographicHash +{ + internal static class Constants + { + #region FNV + + public const uint FNV32Basis = 0x811c9dc5; + public const ulong FNV64Basis = 0xcbf29ce484222325; + + public const uint FNV32Prime = 0x01000193; + public const ulong FNV64Prime = 0x00000100000001b3; + + #endregion + } +} \ No newline at end of file diff --git a/SabreTools.Hashing/Checksum/FNV0_32.cs b/SabreTools.Hashing/NonCryptographicHash/FNV0_32.cs similarity index 79% rename from SabreTools.Hashing/Checksum/FNV0_32.cs rename to SabreTools.Hashing/NonCryptographicHash/FNV0_32.cs index 469d679..52de50a 100644 --- a/SabreTools.Hashing/Checksum/FNV0_32.cs +++ b/SabreTools.Hashing/NonCryptographicHash/FNV0_32.cs @@ -1,6 +1,6 @@ -using static SabreTools.Hashing.Checksum.Constants; +using static SabreTools.Hashing.NonCryptographicHash.Constants; -namespace SabreTools.Hashing.Checksum +namespace SabreTools.Hashing.NonCryptographicHash { public class FNV0_32 : FnvBase { diff --git a/SabreTools.Hashing/Checksum/FNV0_64.cs b/SabreTools.Hashing/NonCryptographicHash/FNV0_64.cs similarity index 79% rename from SabreTools.Hashing/Checksum/FNV0_64.cs rename to SabreTools.Hashing/NonCryptographicHash/FNV0_64.cs index b3f45fe..9fbc7d7 100644 --- a/SabreTools.Hashing/Checksum/FNV0_64.cs +++ b/SabreTools.Hashing/NonCryptographicHash/FNV0_64.cs @@ -1,6 +1,6 @@ -using static SabreTools.Hashing.Checksum.Constants; +using static SabreTools.Hashing.NonCryptographicHash.Constants; -namespace SabreTools.Hashing.Checksum +namespace SabreTools.Hashing.NonCryptographicHash { public class FNV0_64 : FnvBase { diff --git a/SabreTools.Hashing/Checksum/FNV1_32.cs b/SabreTools.Hashing/NonCryptographicHash/FNV1_32.cs similarity index 80% rename from SabreTools.Hashing/Checksum/FNV1_32.cs rename to SabreTools.Hashing/NonCryptographicHash/FNV1_32.cs index 267733c..86a35a6 100644 --- a/SabreTools.Hashing/Checksum/FNV1_32.cs +++ b/SabreTools.Hashing/NonCryptographicHash/FNV1_32.cs @@ -1,6 +1,6 @@ -using static SabreTools.Hashing.Checksum.Constants; +using static SabreTools.Hashing.NonCryptographicHash.Constants; -namespace SabreTools.Hashing.Checksum +namespace SabreTools.Hashing.NonCryptographicHash { public class FNV1_32 : FnvBase { diff --git a/SabreTools.Hashing/Checksum/FNV1_64.cs b/SabreTools.Hashing/NonCryptographicHash/FNV1_64.cs similarity index 80% rename from SabreTools.Hashing/Checksum/FNV1_64.cs rename to SabreTools.Hashing/NonCryptographicHash/FNV1_64.cs index 8a29e5a..5f22bc6 100644 --- a/SabreTools.Hashing/Checksum/FNV1_64.cs +++ b/SabreTools.Hashing/NonCryptographicHash/FNV1_64.cs @@ -1,6 +1,6 @@ -using static SabreTools.Hashing.Checksum.Constants; +using static SabreTools.Hashing.NonCryptographicHash.Constants; -namespace SabreTools.Hashing.Checksum +namespace SabreTools.Hashing.NonCryptographicHash { public class FNV1_64 : FnvBase { diff --git a/SabreTools.Hashing/Checksum/FNV1a_32.cs b/SabreTools.Hashing/NonCryptographicHash/FNV1a_32.cs similarity index 80% rename from SabreTools.Hashing/Checksum/FNV1a_32.cs rename to SabreTools.Hashing/NonCryptographicHash/FNV1a_32.cs index 57a6596..c7b6c75 100644 --- a/SabreTools.Hashing/Checksum/FNV1a_32.cs +++ b/SabreTools.Hashing/NonCryptographicHash/FNV1a_32.cs @@ -1,6 +1,6 @@ -using static SabreTools.Hashing.Checksum.Constants; +using static SabreTools.Hashing.NonCryptographicHash.Constants; -namespace SabreTools.Hashing.Checksum +namespace SabreTools.Hashing.NonCryptographicHash { public class FNV1a_32 : FnvBase { diff --git a/SabreTools.Hashing/Checksum/FNV1a_64.cs b/SabreTools.Hashing/NonCryptographicHash/FNV1a_64.cs similarity index 80% rename from SabreTools.Hashing/Checksum/FNV1a_64.cs rename to SabreTools.Hashing/NonCryptographicHash/FNV1a_64.cs index 1dfde00..2cf5965 100644 --- a/SabreTools.Hashing/Checksum/FNV1a_64.cs +++ b/SabreTools.Hashing/NonCryptographicHash/FNV1a_64.cs @@ -1,6 +1,6 @@ -using static SabreTools.Hashing.Checksum.Constants; +using static SabreTools.Hashing.NonCryptographicHash.Constants; -namespace SabreTools.Hashing.Checksum +namespace SabreTools.Hashing.NonCryptographicHash { public class FNV1a_64 : FnvBase { diff --git a/SabreTools.Hashing/NonCryptographicHash/FnvBase.cs b/SabreTools.Hashing/NonCryptographicHash/FnvBase.cs new file mode 100644 index 0000000..f774381 --- /dev/null +++ b/SabreTools.Hashing/NonCryptographicHash/FnvBase.cs @@ -0,0 +1,60 @@ +using System; + +namespace SabreTools.Hashing.NonCryptographicHash +{ + /// + /// Common base class for FNV non-cryptographic hashes + /// + public abstract class FnvBase : System.Security.Cryptography.HashAlgorithm + { + // No common, untyped functionality + } + + /// + /// Common base class for FNV non-cryptographic hashes + /// + public abstract class FnvBase : FnvBase where T : struct + { + /// + /// Initial value to use + /// + protected T _basis; + + /// + /// Round prime to use + /// + protected T _prime; + + /// + /// The current value of the hash + /// + protected T _hash; + + /// + public override void Initialize() + { + _hash = _basis; + } + + /// + protected override byte[] HashFinal() + { + byte[] hashArr = _hash switch + { + short s => BitConverter.GetBytes(s), + ushort s => BitConverter.GetBytes(s), + + int i => BitConverter.GetBytes(i), + uint i => BitConverter.GetBytes(i), + + long l => BitConverter.GetBytes(l), + ulong l => BitConverter.GetBytes(l), + + _ => [], + }; + + Array.Reverse(hashArr); + return hashArr; + } + } +} \ No newline at end of file