Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Bad performance HmacSM3Signer#hash #965

Open
jht5945 opened this issue Jan 3, 2025 · 1 comment
Open

Bad performance HmacSM3Signer#hash #965

jht5945 opened this issue Jan 3, 2025 · 1 comment

Comments

@jht5945
Copy link

jht5945 commented Jan 3, 2025

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
@yndu13
Copy link
Collaborator

yndu13 commented Jan 3, 2025

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants