From 2635a29044d2a21126d2d9874c44cac5d9052427 Mon Sep 17 00:00:00 2001 From: Bruce Wayne Date: Tue, 15 Sep 2020 20:15:03 +0800 Subject: [PATCH] Code optimization for MD5 --- shadowsocks-csharp/Encryption/CryptoUtils.cs | 21 ++++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/shadowsocks-csharp/Encryption/CryptoUtils.cs b/shadowsocks-csharp/Encryption/CryptoUtils.cs index 0f96abe8..6b50769f 100644 --- a/shadowsocks-csharp/Encryption/CryptoUtils.cs +++ b/shadowsocks-csharp/Encryption/CryptoUtils.cs @@ -3,28 +3,27 @@ using Org.BouncyCastle.Crypto.Digests; using Org.BouncyCastle.Crypto.Generators; using Org.BouncyCastle.Crypto.Parameters; using System; +using System.Security.Cryptography; +using System.Threading; namespace Shadowsocks.Encryption { public static class CryptoUtils { + private static readonly ThreadLocal Md5Hasher = new ThreadLocal(System.Security.Cryptography.MD5.Create); + public static byte[] MD5(byte[] b) { - MD5Digest md5 = new MD5Digest(); - md5.BlockUpdate(b, 0, b.Length); - byte[] r = new byte[16]; - md5.DoFinal(r, 0); - return r; + var hash = new byte[EncryptorBase.MD5Length]; + Md5Hasher.Value.TryComputeHash(b, hash, out _); + return hash; } // currently useless, just keep api same public static Span MD5(Span span) { - byte[] b = span.ToArray(); - MD5Digest md5 = new MD5Digest(); - md5.BlockUpdate(b, 0, b.Length); - byte[] r = new byte[16]; - md5.DoFinal(r, 0); - return r; + Span hash = new byte[EncryptorBase.MD5Length]; + Md5Hasher.Value.TryComputeHash(span, hash, out _); + return hash; } public static byte[] HKDF(int keylen, byte[] master, byte[] salt, byte[] info)