三、常见使用
1)生成6为随机验证码
SecureRandom secureRandom = SecureRandom.getInstance(“SHA1PRNG”);
String verifyCode = String.valueOf(secureRandom.nextInt(900000) + 100000);
四、各种实现及结果验证
package com.basic;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Random;
/**
- 生成6位随机数的三种实现方式
- @author libusi
*/
public class Test01 {
public static void main(String[] args) throws NoSuchAlgorithmException {
demo1();
demo2();
demo3();
demo4();
}
private static void demo1() {
ArrayList<String> list = new ArrayList<>();
for (int i = 0; i < 1000; i++) {
int intValue = Double.valueOf(Math.random() * 1000000).intValue();
String random = String.valueOf(intValue);
String r = (random.length() == 6 && "9".equals(random.substring(0, 1))) ? random : String.valueOf(intValue + 100000);
list.add(r);
}
Collections.sort(list);
list.forEach(System.out::println);
}
private static void demo2() {
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < 10000; i++) {
Random random1 = new Random();
list.add(random1.nextInt(900000) + 100000);
}
Collections.sort(list);
list.forEach(System.out::println);
}
private static void demo3() throws NoSuchAlgorithmException {
ArrayList<String> list = new ArrayList<>();
for (int i = 0; i < 1000000; i++) {
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
String v = String.valueOf(secureRandom.nextInt(900000) + 100000);
list.add(v);
}
Collections.sort(list);
list.forEach(System.out::println);
}
private static void demo4() throws NoSuchAlgorithmException {
//验证SecureRandom
ArrayList<Integer> list = new ArrayList<>();
for (int i = 0; i < 10000; i++) {
SecureRandom random3 = SecureRandom.getInstance("SHA1PRNG");
//生成10位数的随机数
Integer r = random3.nextInt();
//生成0~99的随机数
Integer r2 = random3.nextInt(100);
list.add(r2);
}
Collections.sort(list);
list.forEach(System.out::println);
}
}
五、常见及相关问题总结
1)SecureRandom.getInstance(“SHA1PRNG”)初始化慢
Linux环境,在项目中用到了随机数,使用了SecureRandom.getInstance(“SHA1PRNG”),发现首次运行,时间极长。
本地是Windows环境,运行并不慢。
修改Linux的JVM环境,打开$JAVA_PATH/jre/lib/security/java.security这个文件,找到下面的内容
securerandom.source=file:/dev/random替换为securerandom.source=file:/dev/./urandom
查看本地环境后,竟然发现使用的是urandom。
2)偶遇 JDK 1.8 还未修复的 SecureRandom.getInstance(“SHA1PRNG”) 之 bug
有用请点赞,养成良好习惯!
补充、交流请留言!