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;
}
}