写了一段随机生成5位数字的代码,代码审查发现都是bug,代码如下:
public String getRandomCode(int length)
{
String val = "";
Random random = new Random();
for (int i = 0; i < length; i++)
{
val += String.valueOf(random.nextInt(10));
}
return val;
}
经检查发现Random()函数不是真随机,是伪随机,具有安全问题。循环里面的拼接也有问题,string是不可变字符串,每次循环拼接都会new一个新的,在栈中和堆中都会保留,后经改造使用string的包装类stringbuild,stringbuild是可变字符串,在循环中使用拼接不会对内存造成负担,改造代码如下:
public String getRandomCode(int length)
throws NoSuchAlgorithmException
{
String code = "";
StringBuilder stringBuilder = new StringBuilder();
Random rand = SecureRandom.getInstanceStrong();
for (int i = 0; i < length; i++)
{
stringBuilder.append(String.valueOf(rand.nextInt(10)));
}
code = String.valueOf(stringBuilder);
stringBuilder.delete(0, stringBuilder.length());
return code;
}
也可以使用hutool的工具类
String code = RandomUtil.randomNumbers(length);