mirror of
https://gitee.com/chinabugotech/hutool.git
synced 2025-05-09 23:51:34 +08:00
优化MD5性能
This commit is contained in:
parent
6607b3ab6e
commit
47ab0d02c3
@ -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());
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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;
|
||||
|
||||
/**
|
||||
* 构造
|
||||
*
|
||||
|
@ -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实例
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user