diff --git a/framework/Fur/DataEncryption/MD5Encryption.cs b/framework/Fur/DataEncryption/MD5Encryption.cs index 58d22000679ee32c1b5c50ce7ef7ee03791ec5c0..45bc96f0f6d6bf5793445403f02017f02e9fe620 100644 --- a/framework/Fur/DataEncryption/MD5Encryption.cs +++ b/framework/Fur/DataEncryption/MD5Encryption.cs @@ -1,6 +1,6 @@ using Fur.DependencyInjection; using System; -using System.Reflection; +using System.Runtime.CompilerServices; using System.Security.Cryptography; using System.Text; @@ -10,16 +10,9 @@ namespace Fur.DataEncryption /// MD5 加密 /// [SkipScan] - public unsafe class MD5Encryption + public class MD5Encryption { - private const uint LOWERCASING = 0x2020U; - - private static readonly delegate* managed, Span, uint, void> _EncodeToUtf16Ptr; - - static MD5Encryption() - { - _EncodeToUtf16Ptr = (delegate* managed, Span, uint, void>)typeof(uint).Assembly.GetType("System.HexConverter").GetMethod("EncodeToUtf16", BindingFlags.Static | BindingFlags.Public).MethodHandle.GetFunctionPointer(); - } + private static readonly char[] Digitals = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f' }; /// /// 字符串 MD5 比较 @@ -29,10 +22,8 @@ namespace Fur.DataEncryption /// bool public static bool Compare(string text, string hash) { - using var md5Hash = MD5.Create(); var hashOfInput = Encrypt(text); - var comparer = StringComparer.OrdinalIgnoreCase; - return 0 == comparer.Compare(hashOfInput, hash); + return hash.Equals(hashOfInput, StringComparison.OrdinalIgnoreCase); } /// @@ -42,11 +33,48 @@ namespace Fur.DataEncryption /// public static string Encrypt(string text) { - using var md5Hash = MD5.Create(); - var data = md5Hash.ComputeHash(Encoding.UTF8.GetBytes(text)); - Span output = stackalloc char[32]; - _EncodeToUtf16Ptr(data, output, LOWERCASING); - return new string(output); + var bytes = Encoding.UTF8.GetBytes(text); + + return ByteToString(MD5Instances.Instance.ComputeHash(bytes)); + } + /// + /// 创建MD5实例 + /// + private static class MD5Instances + { + /// + /// 线程静态变量 + /// + [ThreadStatic] + private static MD5 instance; + /// + /// MD5实例 + /// + public static MD5 Instance => instance ?? Create(); + + [MethodImpl(MethodImplOptions.NoInlining)] + private static MD5 Create() + { + instance = MD5.Create() ?? Activator.CreateInstance(); + + return instance; + } + } + /// + /// 重写ToString方法 + /// + /// + /// + private static string ByteToString(byte[] bytes) + { + var chars = new char[bytes.Length * 2]; + var index = 0; + foreach (var item in bytes) + { + chars[index] = Digitals[item >> 4]; ++index; + chars[index] = Digitals[item & 15]; ++index; + } + return new string(chars, 0, chars.Length); } } } \ No newline at end of file diff --git a/framework/Fur/Fur.csproj b/framework/Fur/Fur.csproj index d4eb98628baf718ea3b9cc693dbd66473ed75553..4d8d46baf4685a8529012d1feabb59605aeeca3b 100644 --- a/framework/Fur/Fur.csproj +++ b/framework/Fur/Fur.csproj @@ -2,7 +2,6 @@ net5.0 - true 百小僧/MonkSoul Baiqian Co.,Ltd. © 2020 Fur, Baiqian Co.,Ltd.