优化MD5性能

This commit is contained in:
Looly 2023-05-04 03:14:03 +08:00
parent 6607b3ab6e
commit 47ab0d02c3
4 changed files with 47 additions and 8 deletions

View File

@ -570,7 +570,7 @@ public class DigestUtil {
* @since 4.0.1 * @since 4.0.1
*/ */
public static Digester digester(final DigestAlgorithm algorithm) { public static Digester digester(final DigestAlgorithm algorithm) {
return new Digester(algorithm); return digester(algorithm.getValue());
} }
/** /**

View File

@ -13,39 +13,52 @@
package org.dromara.hutool.crypto.digest; package org.dromara.hutool.crypto.digest;
import org.dromara.hutool.crypto.SecureUtil; import org.dromara.hutool.crypto.SecureUtil;
import org.dromara.hutool.crypto.provider.GlobalProviderFactory;
import java.security.MessageDigest; import java.security.MessageDigest;
import java.security.Provider;
/** /**
* {@link Digester}创建简单工厂用于生产{@link Digester}对象 * {@link Digester}创建简单工厂用于生产{@link Digester}对象<br>
* 参考Guava方式工厂负责持有一个原始的{@link MessageDigest}对象使用时优先通过clone方式创建对象提高初始化性能
* *
* @author looly * @author looly
*/ */
public class DigesterFactory { public class DigesterFactory {
private final MessageDigest prototype;
private final boolean cloneSupport;
/** /**
* 创建工厂 * 创建工厂
* *
* @param algorithm 算法 * @param algorithm 算法
* @return DigesterFactory * @return DigesterFactory
*/ */
public static DigesterFactory of(final String algorithm) { public static DigesterFactory ofJdk(final String algorithm) {
return of(SecureUtil.createJdkMessageDigest(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 * @return DigesterFactory
*/ */
public static DigesterFactory of(final MessageDigest messageDigest) { public static DigesterFactory of(final MessageDigest messageDigest) {
return new DigesterFactory(messageDigest); return new DigesterFactory(messageDigest);
} }
private final MessageDigest prototype;
private final boolean cloneSupport;
/** /**
* 构造 * 构造
* *

View File

@ -25,7 +25,9 @@ import java.nio.charset.Charset;
public class MD5 extends Digester { public class MD5 extends Digester {
private static final long serialVersionUID = 1L; 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实例 * 创建MD5实例

View File

@ -1,5 +1,7 @@
package org.dromara.hutool.crypto.digest; 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.Assertions;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
@ -17,4 +19,26 @@ public class Md5Test {
Assertions.assertEquals(16, hex16.length()); Assertions.assertEquals(16, hex16.length());
Assertions.assertEquals("cb143acd6c929826", hex16); 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);
}
} }