赞
踩
目录
一、生成随机数的方法
Math.random()一随机数 java.util.Random伪随机数(线性同余法生成) java.security.SecureRandom真随机数二、SecureRandom
SecureRandom使用 (1)指定算法名称 仅指定算法名称: SecureRandom random= SecureRandom.getInstance("SHA1PRNG"); //系统将确定环境中是否有所请求的算法实现,是否有多个,是否有首选实现。 既指定了算法名称又指定了包提供程序: SecureRandom random= SecureRandom.getInstance("SHA1PRNG","RUN"); //系统将确定在所请求的包中是否有算法实现;如果没有,则抛出异常。 (2)获取SecureRandom对象后,生成随机数 Integer randNum = random.nextInt();//生成10位数的随机数 Integer randNum = random.nextInt(100);//生成0~99的随机数三、常见使用
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")初始化慢
2) 偶遇 JDK 1.8 还未修复的 SecureRandom.getInstance("SHA1PRNG") 之 bug
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。有用请点赞,养成良好习惯!
补充、交流请留言!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。