优化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
*/
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;
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}对象<br>
* 参考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;
/**
* 构造
*

View File

@ -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实例

View File

@ -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);
}
}