public static String getVerificationCode(int number) throws NoSuchAlgorithmException {
StringBuilder sb = new StringBuilder();
Random rand = SecureRandom.getInstanceStrong();
for (int i = 0; i < number; i++) {
// 目的是产生足够随机的数,避免产生的数字重复率高的问题
int next = rand.nextInt(DigitConst.TEN);
最近上线了一个发送验证码的功能,该功能由组内的一个同事书写。需要随机生成一定长度的验证码,代码片段如上所示。开发环境以及测试环境都没问题。上线到华为云的docker环境中,发送验证码经常超时。现象表现为触发发送验证码后,隔了很长时间没有发送。通过日志看,没有触发调用第三方的短信发送接口。
通过在线上获取jstack后,发现处理线程一直处于runnable状态,业务代码对应 int next = rand.nextInt(DigitConst.TEN),从而怀疑是生成随机数很慢导致。通过网络查询SecureRandom随机数生成,发现其他人也遇到类似问题。根据建议,将获取Random实例的方法改成 Random rand = SecureRandom.getInstance("NativePRNGNonBlocking"),问题得以解决。