当前位置: 首页 > wzjs >正文

威海建设局网站楼盘信息公布宁波seo优化公司排名

威海建设局网站楼盘信息公布,宁波seo优化公司排名,北外新闻行业门户网站建设,郑州市多商家网站制作公司简介 在实际开发中,经常遇到需要生成随机数的场景,例如,发送短信验证码等。这里对生成随机数的解决方案做个总结 随机数的生成原理 随机数是通过算法生成的,生成随机数的过程中涉及到几个重要的概念,包括种子、随机…

简介

在实际开发中,经常遇到需要生成随机数的场景,例如,发送短信验证码等。这里对生成随机数的解决方案做个总结

随机数的生成原理

随机数是通过算法生成的,生成随机数的过程中涉及到几个重要的概念,包括种子、随机数算法、系统熵源。

种子:seed,随机数生成算法的初始输入值,决定了随机数序列的起点,相同的种子会生成完全相同的随机数序列,这使得随机数的生成可重现,用于调试或实验,如果用户没有指定种子,通常使用系统时间(System.nanoTime())作为默认种子

随机数生成算法:通过特定的计算,生成指定范围内的随机数,算法是固定的,不同的是种子,所以如果种子相同,生成的随机数序列就是固定的,统计上满足随机性,但可预测。常见的随机数生成算法,如线性同余算法。

系统熵源:系统收集的真实随机性来源,如硬件噪声、键盘输入时间、鼠标移动等,例如,Linux系统上,系统熵源的设备文件是 /dev/random,通过系统熵源,可以获取到真正随机的种子,生成不可预测的随机数序列,但是系统熵源需要收集系统熵的信息,可能会阻塞

三者的关系:种子是伪随机数生成的起点,伪随机数通过算法模拟随机性,依赖种子,熵源为安全随机数提供真正的不可预测性。

为什么伪随机数不安全?因为算法是公开的,若攻击者知道种子或部分序列,可推算后续随机数。

生成随机数的方法

Random

Random类,支持生成整数、随机数、布尔值类型的随机数,非线程安全,适合单线程环境下的基本随机数需求,不适合高并发、安全敏感的场景,随机性可预测

案例:生成0到100之间的随机数

@Test
public void test2() {Random random = new Random();int i = random.nextInt(100);System.out.println("i = " + i);
}

案例2:Math类中提供的工具方法,底层也是调用的Random

// Math.random,生成[0.0, 1.0)之间的double类型的伪随机数,内部调用Random类实现,
// 适合快速生成随机数的场景,不适合高并发,无法指定随机种子,所以无法重现随机序列
@Test
public void test1() {double random = Math.random();System.out.println("random = " + random);  // 0.24365653692120037
}

ThreadLocalRandom

为每个线程维护独立的种子,适合高并发场景,但仍然是伪随机

案例:生成0到100之间的随机数

@Test
public void test3() {int i = ThreadLocalRandom.current().nextInt(100);System.out.println("i = " + i);
}

SecureRandom

SecureRandom,基于系统熵源,如 /dev/random,加密强度高,线程安全但性能较低,适用于秘钥、令牌、验证码登安全敏感场景,可以生成不可预测的随机数

案例:

@Test
public void test4() {SecureRandom secureRandom = new SecureRandom();byte[] bytes = new byte[128];secureRandom.nextBytes(bytes);System.out.println("bytes = " + Arrays.toString(bytes));
}

熵池耗尽问题:SecureRandom是从系统熵源中获取种子,系统熵源可能会阻塞,可能会耗尽,Linux提供了两个熵源:

  • /dev/random:阻塞型,当熵不足时等待新熵(更安全)。
  • /dev/urandom:非阻塞型,熵不足时用伪随机算法补足(性能更好,多数场景足够安全)。

实战案例

案例1:生成6位的验证码

在方案选型时,选择ThreadLocalRandom,它在高并发的情况下性能更好,虽然没有SecureRandom那么安全,一次生成6位数字,而不是生成6次,每次生成1位随机数,因为过多的随机数序列更加容易被破解,毕竟它是伪随机的。

@Test
public void testMsgCode() {int limit = 1000_000;int i = ThreadLocalRandom.current().nextInt(limit);String str = String.format("%06d", i);  // 随机数不足6位时前面补0System.out.println("str = " + str);  // 738210
}
http://www.dtcms.com/wzjs/438252.html

相关文章:

  • 做孝道的网站的目的seo网站优化推广费用
  • 郑州模板网站建设苏州百度推广开户
  • 东莞一站式网站建设想学管理方面的培训班
  • b2b电子商务网站调研报告免费新浪体育世界杯
  • java做网站后台怎么样宁德市人力资源和社会保障局
  • 宿迁市住房和城乡建设局网站培训管理平台
  • 网站等级保护测评必须做吗短链接在线生成官网
  • 网站建设banner图武汉网络推广有限公司
  • 搜狗提交网站收录入口南京市网站seo整站优化
  • 网站模板如何修改域名吴江seo网站优化软件
  • html5做动态网站建设2023年7月最新疫情
  • 天津网站建设好公司平台推广是什么意思
  • 广州的十七做网站站点搜索
  • 做设计的一般用什么网站找素材win7优化
  • 中核二三公司是国企还是央企搜索引擎优化是指什么意思
  • 江门网站排名优化百度关键词怎么设置
  • 上海平台网站建设公司排名百度秒收录蜘蛛池
  • 潍坊市政府门户网站螺蛳粉营销策划方案
  • 西安专业手机网站建设价格天津网络推广公司
  • 武安专业做网站南昌seo推广
  • wordpress配置文件数据库宁波seo外包引流推广
  • 源码资源下载站百度快照怎么看
  • 做网站需要什么硬件环境网址查询入口
  • 网站建设CEOseo需要懂代码吗
  • 做网站公司松江免费seo优化
  • 做邮轮的网站交换链接是什么
  • 小米路由HD可以做网站吗网络推广公司专业网络
  • 企业门户网站方案免费广告网
  • 网站建设制作多少钱seo 优化技术难度大吗
  • 网站价值评估 phpseo是什么品牌