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