aliyun-openapi-java-sdk
aliyun-openapi-java-sdk copied to clipboard
Bad performance HmacSM3Signer#hash
Source file: https://github.com/aliyun/aliyun-openapi-java-sdk/blob/master/aliyun-java-sdk-core/src/main/java/com/aliyuncs/auth/signers/HmacSM3Signer.java
new BouncyCastleProvider() is very heavy, BouncyCastleProvider should use as singleton, here is the simple benchmark test code:
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Base64;
public class Tt {
public static void main(String[] args) throws NoSuchAlgorithmException, InterruptedException {
long t1 = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
String digest = Base64.getEncoder().encodeToString(hash("test".getBytes(StandardCharsets.UTF_8)));
AssertUtil.isTrue("VeEukWUNL+xW7HTh0+Tdv84u86ZYkMKhns+IowfnaiM=".equals(digest));
}
System.out.println((System.currentTimeMillis() - t1) + " ms");
long t2 = System.currentTimeMillis();
for (int i = 0; i < 1000; i++) {
String digest = Base64.getEncoder().encodeToString(hash2("test".getBytes(StandardCharsets.UTF_8)));
AssertUtil.isTrue("VeEukWUNL+xW7HTh0+Tdv84u86ZYkMKhns+IowfnaiM=".equals(digest));
}
System.out.println((System.currentTimeMillis() - t2) + " ms");
}
private static String HASH_SM3 = "SM3";
private static BouncyCastleProvider PROVIDER = new BouncyCastleProvider();
public static byte[] hash(byte[] raw) throws NoSuchAlgorithmException {
if (null == raw) {
return null;
}
BouncyCastleProvider provider = new BouncyCastleProvider();
MessageDigest digest = MessageDigest.getInstance(HASH_SM3, provider);
return digest.digest(raw);
}
public static byte[] hash2(byte[] raw) throws NoSuchAlgorithmException {
if (null == raw) {
return null;
}
MessageDigest digest = MessageDigest.getInstance(HASH_SM3, PROVIDER);
return digest.digest(raw);
}
}
Outputs:
2760 ms
4 ms
Thanks for your feedback, we will consider it and reply to you as soon as possible.