当前位置:   article > 正文

SecureRandom生成随机数-验证码

securerandom

目录

一、生成随机数的方法

二、SecureRandom

三、常见使用

四、各种实现及结果验证

五、常见及相关问题总结


一、生成随机数的方法

  1. Math.random()一随机数
  2. java.util.Random伪随机数(线性同余法生成)
  3. java.security.SecureRandom真随机数

二、SecureRandom

  1. SecureRandom使用
  2. 1)指定算法名称
  3. 仅指定算法名称:
  4. SecureRandom random= SecureRandom.getInstance("SHA1PRNG");
  5. //系统将确定环境中是否有所请求的算法实现,是否有多个,是否有首选实现。
  6. 既指定了算法名称又指定了包提供程序:
  7. SecureRandom random= SecureRandom.getInstance("SHA1PRNG","RUN");
  8. //系统将确定在所请求的包中是否有算法实现;如果没有,则抛出异常。
  9. 2)获取SecureRandom对象后,生成随机数
  10. Integer randNum = random.nextInt();//生成10位数的随机数
  11. Integer randNum = random.nextInt(100);//生成0~99的随机数

三、常见使用

1)生成6为随机验证码

  1. SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
  2. String verifyCode = String.valueOf(secureRandom.nextInt(900000) + 100000);

四、各种实现及结果验证

  1. package com.basic;
  2. import java.security.NoSuchAlgorithmException;
  3. import java.security.NoSuchProviderException;
  4. import java.security.SecureRandom;
  5. import java.util.ArrayList;
  6. import java.util.Collections;
  7. import java.util.Random;
  8. /**
  9. * 生成6位随机数的三种实现方式
  10. * @author libusi
  11. */
  12. public class Test01 {
  13. public static void main(String[] args) throws NoSuchAlgorithmException {
  14. demo1();
  15. demo2();
  16. demo3();
  17. demo4();
  18. }
  19. private static void demo1() {
  20. ArrayList<String> list = new ArrayList<>();
  21. for (int i = 0; i < 1000; i++) {
  22. int intValue = Double.valueOf(Math.random() * 1000000).intValue();
  23. String random = String.valueOf(intValue);
  24. String r = (random.length() == 6 && "9".equals(random.substring(0, 1))) ? random : String.valueOf(intValue + 100000);
  25. list.add(r);
  26. }
  27. Collections.sort(list);
  28. list.forEach(System.out::println);
  29. }
  30. private static void demo2() {
  31. ArrayList<Integer> list = new ArrayList<>();
  32. for (int i = 0; i < 10000; i++) {
  33. Random random1 = new Random();
  34. list.add(random1.nextInt(900000) + 100000);
  35. }
  36. Collections.sort(list);
  37. list.forEach(System.out::println);
  38. }
  39. private static void demo3() throws NoSuchAlgorithmException {
  40. ArrayList<String> list = new ArrayList<>();
  41. for (int i = 0; i < 1000000; i++) {
  42. SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
  43. String v = String.valueOf(secureRandom.nextInt(900000) + 100000);
  44. list.add(v);
  45. }
  46. Collections.sort(list);
  47. list.forEach(System.out::println);
  48. }
  49. private static void demo4() throws NoSuchAlgorithmException {
  50. //验证SecureRandom
  51. ArrayList<Integer> list = new ArrayList<>();
  52. for (int i = 0; i < 10000; i++) {
  53. SecureRandom random3 = SecureRandom.getInstance("SHA1PRNG");
  54. //生成10位数的随机数
  55. Integer r = random3.nextInt();
  56. //生成0~99的随机数
  57. Integer r2 = random3.nextInt(100);
  58. list.add(r2);
  59. }
  60. Collections.sort(list);
  61. list.forEach(System.out::println);
  62. }
  63. }

五、常见及相关问题总结

1)SecureRandom.getInstance("SHA1PRNG")初始化慢

  1. Linux环境,在项目中用到了随机数,使用了SecureRandom.getInstance("SHA1PRNG"),发现首次运行,时间极长。
  2. 本地是Windows环境,运行并不慢。
  3. 修改Linux的JVM环境,打开$JAVA_PATH/jre/lib/security/java.security这个文件,找到下面的内容
  4. securerandom.source=file:/dev/random替换为securerandom.source=file:/dev/./urandom
  5. 查看本地环境后,竟然发现使用的是urandom。
2) 偶遇 JDK 1.8 还未修复的 SecureRandom.getInstance("SHA1PRNG") 之 bug

有用请点赞,养成良好习惯!

补充、交流请留言!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/413262
推荐阅读
相关标签
  

闽ICP备14008679号