using System.Collections.Generic; namespace pkNX.Containers; /// /// Fowler–Noll–Vo non-cryptographic hash /// public static class FnvHash { // 64 bit implementation private const ulong kFnvPrime_64 = 0x00000100000001b3; private const ulong kOffsetBasis_64 = 0xCBF29CE484222645; /// /// Gets the hash code of the input sequence via the default Fnv1 method. /// /// Input sequence /// Initial hash value /// Computed hash code public static ulong HashFnv1_64(IEnumerable input, ulong hash = kOffsetBasis_64) { foreach (var c in input) { hash *= kFnvPrime_64; hash ^= c; } return hash; } /// /// Gets the hash code of the input sequence via the default Fnv1 method. /// /// Input sequence /// Initial hash value /// Computed hash code public static ulong HashFnv1_64(IEnumerable input, ulong hash = kOffsetBasis_64) { foreach (var c in input) { hash *= kFnvPrime_64; hash ^= c; } return hash; } /// /// Gets the hash code of the input sequence via the alternative Fnv1 method. /// /// Input sequence /// Initial hash value /// Computed hash code public static ulong HashFnv1a_64(IEnumerable input, ulong hash = kOffsetBasis_64) { foreach (var c in input) { hash ^= c; hash *= kFnvPrime_64; } return hash; } /// /// Gets the hash code of the input sequence via the alternative Fnv1 method. /// /// Input sequence /// Initial hash value /// Computed hash code public static ulong HashFnv1a_64(IEnumerable input, ulong hash = kOffsetBasis_64) { foreach (var c in input) { hash ^= c; hash *= kFnvPrime_64; } return hash; } // 32 bit implementation private const uint kFnvPrime_32 = 0x01000193; private const uint kOffsetBasis_32 = 0x811C9DC5; /// /// Gets the hash code of the input sequence via the default Fnv1 method. /// /// Input sequence /// Initial hash value /// Computed hash code public static uint HashFnv1_32(IEnumerable input, uint hash = kOffsetBasis_32) { foreach (var c in input) { hash *= kFnvPrime_32; hash ^= c; } return hash; } /// /// Gets the hash code of the input sequence via the alternative Fnv1 method. /// /// Input sequence /// Initial hash value /// Computed hash code public static uint HashFnv1a_32(IEnumerable input, uint hash = kOffsetBasis_32) { foreach (var c in input) { hash ^= c; hash *= kFnvPrime_32; } return hash; } }