aliyun-openapi-java-sdk icon indicating copy to clipboard operation
aliyun-openapi-java-sdk copied to clipboard

Bad performance HmacSM3Signer#hash

Open jht5945 opened this issue 1 year ago • 1 comments

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

jht5945 avatar Jan 03 '25 01:01 jht5945

Thanks for your feedback, we will consider it and reply to you as soon as possible.

yndu13 avatar Jan 03 '25 10:01 yndu13