diff --git a/hutool-crypto/src/main/java/org/dromara/hutool/crypto/digest/DigestUtil.java b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/digest/DigestUtil.java index 9bd86048e..1fa594c8f 100644 --- a/hutool-crypto/src/main/java/org/dromara/hutool/crypto/digest/DigestUtil.java +++ b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/digest/DigestUtil.java @@ -570,7 +570,7 @@ public class DigestUtil { * @since 4.0.1 */ public static Digester digester(final DigestAlgorithm algorithm) { - return new Digester(algorithm); + return digester(algorithm.getValue()); } /** diff --git a/hutool-crypto/src/main/java/org/dromara/hutool/crypto/digest/DigesterFactory.java b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/digest/DigesterFactory.java index 914adef7f..0aa1f5a78 100644 --- a/hutool-crypto/src/main/java/org/dromara/hutool/crypto/digest/DigesterFactory.java +++ b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/digest/DigesterFactory.java @@ -13,39 +13,52 @@ package org.dromara.hutool.crypto.digest; import org.dromara.hutool.crypto.SecureUtil; +import org.dromara.hutool.crypto.provider.GlobalProviderFactory; import java.security.MessageDigest; +import java.security.Provider; /** - * {@link Digester}创建简单工厂,用于生产{@link Digester}对象 + * {@link Digester}创建简单工厂,用于生产{@link Digester}对象
+ * 参考Guava方式,工厂负责持有一个原始的{@link MessageDigest}对象,使用时优先通过clone方式创建对象,提高初始化性能。 * * @author looly */ public class DigesterFactory { - private final MessageDigest prototype; - private final boolean cloneSupport; - /** * 创建工厂 * * @param algorithm 算法 * @return DigesterFactory */ - public static DigesterFactory of(final String algorithm) { + public static DigesterFactory ofJdk(final String algorithm) { return of(SecureUtil.createJdkMessageDigest(algorithm)); } + /** + * 创建工厂,使用{@link GlobalProviderFactory}找到的提供方。 + * + * @param algorithm 算法 + * @return DigesterFactory + */ + public static DigesterFactory of(final String algorithm) { + return of(SecureUtil.createMessageDigest(algorithm, null)); + } + /** * 创建工厂 * - * @param messageDigest {@link MessageDigest} + * @param messageDigest {@link MessageDigest},可以通过{@link SecureUtil#createMessageDigest(String, Provider)} 创建 * @return DigesterFactory */ public static DigesterFactory of(final MessageDigest messageDigest) { return new DigesterFactory(messageDigest); } + private final MessageDigest prototype; + private final boolean cloneSupport; + /** * 构造 * diff --git a/hutool-crypto/src/main/java/org/dromara/hutool/crypto/digest/MD5.java b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/digest/MD5.java index 05544d07b..4310aec91 100644 --- a/hutool-crypto/src/main/java/org/dromara/hutool/crypto/digest/MD5.java +++ b/hutool-crypto/src/main/java/org/dromara/hutool/crypto/digest/MD5.java @@ -25,7 +25,9 @@ import java.nio.charset.Charset; public class MD5 extends Digester { private static final long serialVersionUID = 1L; - private static final DigesterFactory FACTORY = DigesterFactory.of(DigestAlgorithm.MD5.getValue()); + // issue#I6ZIQH + // MD5算法不使用BC库,使用JDK默认以提高初始性能 + private static final DigesterFactory FACTORY = DigesterFactory.ofJdk(DigestAlgorithm.MD5.getValue()); /** * 创建MD5实例 diff --git a/hutool-crypto/src/test/java/org/dromara/hutool/crypto/digest/Md5Test.java b/hutool-crypto/src/test/java/org/dromara/hutool/crypto/digest/Md5Test.java index 4d8b5cbab..98187c3d3 100644 --- a/hutool-crypto/src/test/java/org/dromara/hutool/crypto/digest/Md5Test.java +++ b/hutool-crypto/src/test/java/org/dromara/hutool/crypto/digest/Md5Test.java @@ -1,5 +1,7 @@ package org.dromara.hutool.crypto.digest; +import org.dromara.hutool.core.io.IoUtil; +import org.dromara.hutool.core.thread.ConcurrencyTester; import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; @@ -17,4 +19,26 @@ public class Md5Test { Assertions.assertEquals(16, hex16.length()); Assertions.assertEquals("cb143acd6c929826", hex16); } + + @Test + void md5ThreadSafeTest() { + final String text = "Hutool md5 test str"; + final ConcurrencyTester tester = new ConcurrencyTester(1000); + tester.test(()->{ + final String digest = MD5.of().digestHex(text); + Assertions.assertEquals("8060075dd8df47bac3247438e940a728", digest); + }); + IoUtil.closeQuietly(tester); + } + + @Test + void md5ThreadSafeTest2() { + final String text = "Hutool md5 test str"; + final ConcurrencyTester tester = new ConcurrencyTester(1000); + tester.test(()->{ + final String digest = new Digester("MD5").digestHex(text); + Assertions.assertEquals("8060075dd8df47bac3247438e940a728", digest); + }); + IoUtil.closeQuietly(tester); + } }