From c65184689d41c8909999ce608ffd4dc2d1208e1a Mon Sep 17 00:00:00 2001 From: Matt Nadareski Date: Thu, 2 Jan 2025 15:15:53 -0500 Subject: [PATCH] FNV are non-cryptographic hashes --- SabreTools.Hashing/Checksum/Constants.cs | 16 ++--- SabreTools.Hashing/Checksum/FnvBase.cs | 21 ------- SabreTools.Hashing/HashWrapper.cs | 1 + .../NonCryptographicHash/Constants.cs | 15 +++++ .../FNV0_32.cs | 4 +- .../FNV0_64.cs | 4 +- .../FNV1_32.cs | 4 +- .../FNV1_64.cs | 4 +- .../FNV1a_32.cs | 4 +- .../FNV1a_64.cs | 4 +- .../NonCryptographicHash/FnvBase.cs | 60 +++++++++++++++++++ 11 files changed, 93 insertions(+), 44 deletions(-) delete mode 100644 SabreTools.Hashing/Checksum/FnvBase.cs create mode 100644 SabreTools.Hashing/NonCryptographicHash/Constants.cs rename SabreTools.Hashing/{Checksum => NonCryptographicHash}/FNV0_32.cs (79%) rename SabreTools.Hashing/{Checksum => NonCryptographicHash}/FNV0_64.cs (79%) rename SabreTools.Hashing/{Checksum => NonCryptographicHash}/FNV1_32.cs (80%) rename SabreTools.Hashing/{Checksum => NonCryptographicHash}/FNV1_64.cs (80%) rename SabreTools.Hashing/{Checksum => NonCryptographicHash}/FNV1a_32.cs (80%) rename SabreTools.Hashing/{Checksum => NonCryptographicHash}/FNV1a_64.cs (80%) create mode 100644 SabreTools.Hashing/NonCryptographicHash/FnvBase.cs 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