Maps a 64-Bit Hash Into a 32-Bit Space
using System.Security.Cryptography;
/// <summary>
/// Pros: ~no Collisions within int bit space ~(2,147,483,647)
/// Cons: Maintains a TinyDictionary(byte[],byte[]), non-deterministic across application or
/// method domains
/// Cannot Transform or reuse.
/// </summary>
public class Mapping64BitToHash32Bit : HashAlgorithm
{
private readonly FNV1a64 hasher = new FNV1a64();
public readonly TinyDictionary<byte[], byte[]> map = new TinyDictionary<byte[], byte[]>(101, new ArrayComparer());
private byte[] h64;
public override int HashSize => 32;
public override void Initialize()
{
}
/// <inheritdoc />
/// <summary>
/// Compute the 64 Bit hash value and add it and the original array to the map to create a unique position within the
/// TinyDictionary.
/// </summary>
protected override void HashCore(byte[] bytes, int ibStart, int cbSize)
{
h64 = hasher.ComputeHash(bytes, ibStart, cbSize);
map.Add(h64, bytes);
}
/// <inheritdoc />
/// <summary>
/// Return the unique position within the TinyDictionary as the hash value (index).
/// </summary>
protected override byte[] HashFinal()
{
HashValue = (byte[]) map.FindKeyIndex(h64).GetBytes().Clone();
return HashValue;
}
}