using System; using System.IO; using System.Text; using System.Reflection; using System.Runtime.CompilerServices; using System.Security.Cryptography; public static class HashAlgorithm where THashAlgorithm : HashAlgorithm { /// /// 线程静态变量:即该变量在每个线程中唯一目的是为了避开多线程问题 /// [ThreadStatic] private static THashAlgorithm instance; /// /// 哈希算法单例。 /// public static THashAlgorithm Instance => instance ?? Create(); public static string ComputeHash(Stream input) { var instance = Instance; var bytes = instance.ComputeHash(input); var result = Convert.ToBase64String(bytes); return result; } public static string ComputeHash(byte[] input) { var instance = Instance; var bytes = instance.ComputeHash(input); var result = Convert.ToBase64String(bytes); return result; } public static string ComputeHash(string input) { var bytes = Encoding.UTF8.GetBytes(input); return ComputeHash(bytes); } [MethodImpl(MethodImplOptions.NoInlining)] private static THashAlgorithm Create() { var createMethod = typeof(THashAlgorithm).GetMethod( nameof(HashAlgorithm.Create), BindingFlags.Public | BindingFlags.Static | BindingFlags.DeclaredOnly, Type.DefaultBinder, Type.EmptyTypes, null); if (createMethod != null) instance = (THashAlgorithm)createMethod.Invoke(null, new object[] { }); else instance = Activator.CreateInstance(); return instance; } }