private static uint SignatureCore(byte[] data, uint seed, MurmurHash3Types types, MurmurHash3Preference preference, MurmurHash3Managed managed) { switch (types) { case MurmurHash3Types.FAST: { return(MurmurHash3Core.FastMode.Hash32(data.AsSpan(), seed)); } case MurmurHash3Types.L_32: { var l32 = MurmurHash3Core.CreateL32(seed, managed); var h32 = l32.ComputeHash(data); return(BitConverter.ToUInt32(h32, 0)); } case MurmurHash3Types.L_128: { var l128 = MurmurHash3Core.CreateL128(seed, managed, preference); var h128 = l128.ComputeHash(data); return(BitConverter.ToUInt32(h128, 0)); } default: throw new NotImplementedException("Unknown type for MurmurHash3 hash provider."); } }
/// <summary> /// Signature hash /// </summary> /// <param name="data"></param> /// <param name="seed"></param> /// <param name="types"></param> /// <param name="preference"></param> /// <param name="managed"></param> /// <returns></returns> public static byte[] SignatureHash(byte[] data, uint seed, MurmurHash3Types types = MurmurHash3Types.FAST, MurmurHash3Preference preference = MurmurHash3Preference.AUTO, MurmurHash3Managed managed = MurmurHash3Managed.TRUE) { return(BitConverter.GetBytes(Signature(data, seed, types, preference, managed))); }
/// <summary> /// Signature /// </summary> /// <param name="data"></param> /// <param name="seed"></param> /// <param name="types"></param> /// <param name="preference"></param> /// <param name="managed"></param> /// <returns></returns> public static uint Signature(byte[] data, uint seed, MurmurHash3Types types = MurmurHash3Types.FAST, MurmurHash3Preference preference = MurmurHash3Preference.AUTO, MurmurHash3Managed managed = MurmurHash3Managed.TRUE) { Checker.Buffer(data); return(SignatureCore(data, seed, types, preference, managed)); }
/// <summary> /// Signature /// </summary> /// <param name="data"></param> /// <param name="seed"></param> /// <param name="encoding"></param> /// <param name="types"></param> /// <param name="preference"></param> /// <param name="managed"></param> /// <returns></returns> public static uint Signature(string data, uint seed, Encoding encoding = null, MurmurHash3Types types = MurmurHash3Types.FAST, MurmurHash3Preference preference = MurmurHash3Preference.AUTO, MurmurHash3Managed managed = MurmurHash3Managed.TRUE) { Checker.Data(data); var bytes = encoding.SafeValue().GetBytes(data); return(SignatureCore(bytes, seed, types, preference, managed)); }
/// <inheritdoc /> public MurmurHash3InputStream(Stream underlyingStream, uint seed = 0, MurmurHash3Managed managed = MurmurHash3Managed.TRUE, MurmurHash3Types types = MurmurHash3Types.L_128, MurmurHash3Preference preference = MurmurHash3Preference.AUTO) { _underlyingStream = underlyingStream; _algorithm = types switch { MurmurHash3Types.L_32 => (HashAlgorithm)MurmurHash3Core.CreateL32(seed, managed), MurmurHash3Types.L_128 => (HashAlgorithm)MurmurHash3Core.CreateL128(seed, managed, preference), _ => throw new InvalidOperationException("Invalid operation because only support L32 and L128") }; }
/// <summary> /// Verify /// </summary> /// <param name="comparison"></param> /// <param name="data"></param> /// <param name="seed"></param> /// <param name="types"></param> /// <param name="preference"></param> /// <param name="managed"></param> /// <returns></returns> public static bool Verify(uint comparison, byte[] data, uint seed, MurmurHash3Types types = MurmurHash3Types.FAST, MurmurHash3Preference preference = MurmurHash3Preference.AUTO, MurmurHash3Managed managed = MurmurHash3Managed.TRUE) => comparison == Signature(data, seed, types, preference, managed);
/// <summary> /// Verify /// </summary> /// <param name="comparison"></param> /// <param name="data"></param> /// <param name="seed"></param> /// <param name="encoding"></param> /// <param name="types"></param> /// <param name="preference"></param> /// <param name="managed"></param> /// <returns></returns> public static bool Verify(uint comparison, string data, uint seed, Encoding encoding = null, MurmurHash3Types types = MurmurHash3Types.FAST, MurmurHash3Preference preference = MurmurHash3Preference.AUTO, MurmurHash3Managed managed = MurmurHash3Managed.TRUE) => comparison == Signature(data, seed, encoding, types, preference, managed);
/// <summary> /// Create a new instance of <see cref="MurmurHash3OutputStream"/>. /// </summary> /// <param name="stream"></param> /// <param name="seed"></param> /// <param name="managed"></param> /// <param name="types"></param> /// <param name="preference"></param> /// <returns></returns> public static MurmurHash3OutputStream CreateOutputStream(Stream stream, uint seed = 0, MurmurHash3Managed managed = MurmurHash3Managed.TRUE, MurmurHash3Types types = MurmurHash3Types.L_128, MurmurHash3Preference preference = MurmurHash3Preference.AUTO) => new MurmurHash3OutputStream(stream, seed, managed, types, preference);