随机数发生器怎么用_用随机数发生器射击自己的脚

随机数发生器怎么用

这将不是解释随机数生成器毕竟不是那么随机的文章之一。 因此,您中的那些人希望获得有关如何破解老虎机,继续前进的指南,在这里什么也看不到。

相反,它是有关一个不太常见的锁争用问题的帖子,该问题隐藏在Java API的随机数生成器中。

要打开该主题,让我们开始研究如何在java.util.Random类中处理并发。 java.util.Random的实例是线程安全的。 但是,在线程之间并发使用同一java.util.Random实例是同步的,并且正如我们发现的那样,它倾向于触发影响应用程序性能的争用问题。

在您日常的日常企业应用程序中,这听起来似乎不是一个重要的问题–毕竟,您实际上有多少次实际执行了故意无法预测的事情? 相反,您只是在按照可预见的方式遵循业务规则。 我必须承认,尽管在某些情况下,这些业务规则比真正的随机种子生成算法所涉及的熵甚至更大,但这完全是另一回事。

但是魔鬼隐藏在细节中,在这种情况下,碰巧是java.util.Random的子类,即java.util.SecureRandom 。 此类,如名称所述,应在随机数生成器的结果必须是加密安全的情况下使用。 出于人类未知的原因,在通常不希望随机性的密码安全方面具有重要意义的情况下,已将该实现选择为许多常见API的主干。

我们通过密切关注锁争用检测解决方案的采用来亲身体验这个问题。 根据结果​​,通过看起来无辜的java.io.File.createTempFile()调用触发Java应用程序中最常见的锁定问题之一。 在后台,这种临时文件的创建依赖于SecureRandom类来计算文件的名称。

private static final SecureRandom random = new SecureRandom();
static File generateFile(String prefix, String suffix, File dir) {long n = random.nextLong();if (n == Long.MIN_VALUE) {n = 0;      // corner case} else {n = Math.abs(n);}return new File(dir, prefix + Long.toString(n) + suffix);
}

然后,当调用nextLong时,SecureRandom最终调用其方法nextBytes() ,该方法定义为synced :

synchronized public void nextBytes(byte[] bytes) {secureRandomSpi.engineNextBytes(bytes);
}

有人会说,如果我在每个线程中创建新的SecureRandom,我将不会遇到任何问题。 不幸的是,这并不是那么简单。 SecureRandom使用java.security.SecureRandomSpi的实现,无论如何最终都会争夺它(您可能会在Jenkins问题跟踪器中看到以下带有一些基准的bug讨论)

这与某些应用程序使用模式结合在一起(尤其是如果您有许多SSL连接依靠SecureRandom来实现其加密握手魔术),则有形成长期持久争用问题的趋势。

如果您可以控制源代码,则解决此问题的方法很简单–只需重建解决方案即可依靠java.util.ThreadLocalRandom进行多线程设计。 如果您坚持使用标准API,则解决方案可能会更加复杂,并且需要大量重构。

故事的道德启示? 并发很难。 尤其是在您的系统构建模块未考虑到这一点的情况下。 无论如何,我确实希望这篇文章至少从两个新库的诞生中拯救世界,在新库中,随机数生成器将成为竞争点。

翻译自: https://www.javacodegeeks.com/2015/03/shooting-yourself-in-the-foot-with-random-number-generators.html

随机数发生器怎么用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/337752.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux 4.14.2编译,vmware中linux内核2.6.14.4编译全过程_linux教程

很久就开始尝试编译Linux内核,但是总是遇到不少的问题,经过几十次的编译,直到现在才解决,人都要崩溃了。所以干脆把这个过程写出来,希望在你遇到同样问题的时候少走点弯路。我用的是Red Hat Linux 9. 内核版本是2.6.14…

C++ STL deque 容器底层实现原理(深度剖析)

点击蓝字关注我们什么是多态,多态有什么用途?定义:“一个接口,多种方法”,程序在运行时才决定调用的函数。实现:C多态性主要是通过虚函数实现的,虚函数允许子类重写override(注意和overload的区…

lambda ::_Lambdas中的例外:有点混乱的优雅解决方案

lambda ::考虑以下用于写入文件的功能: 该方法背后的想法是,以允许用户在不同的实施方式中通过InputStream的方法,以便writeToFile可以被称为例如用GZIPOuputStream , SnappyOuputStream (快速压缩)或简单…

​常问的16个C语言问题,你能答上来几个?

点击蓝字关注我们最近不少小伙伴在找工作,这里我给大家分享一下面试中经常会遇到的一些嵌入式C语言问题,你看看能答上来几个呢?1用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题)#de…

centos linux 内核升级,Centos系统的升级及Linux 内核升级

系统及内核版本:[rootnode5 ~]# cat /etc/redhat-releaseCentOS Linux release 7.3.1611 (Core)[rootnode5 ~]# uname -aLinux node6 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux更新仓库:[rootnode5 yu…

spring javaee_JavaEE还是Spring? 都不行! 我们呼吁新的竞争者!

spring javaee如果您一直在Twitter上关注一些Java的重要人物,或者在Reddit上阅读了“新闻”,那么您一定不会错过Spring和JavaEE宣传人员之间热闹的“贱人之战”(请原谅我的法语)。 首先,于尔根霍勒(JrgenH…

C语言代码优化的方法

点击蓝字关注我们在本篇文章中,我(指原作者)收集了很多经验和方法。应用这些经验和方法,可以帮助我们从执行速度和内存使用等方面来优化C语言代码。简介在最近的一个项目中,我们需要开发一个运行在移动设备上但不保证图像高质量的轻量级JPEG库…

linux源码安装apache2,CentOS7编译安装Apache2

在LAMP环境下对于服务的安装是必不可少的,在linux环境下安装软件也有两种不同的方式,一种是yum安装当然了不同的linux发行版本使用略有不同,另一种是通过编译安装,编译安装要比yum安装要可控此,但是要比yum安装略微麻烦…

finally块_如何从finally块访问方法的结果值

finally块尽管JVM是基于堆栈的计算机 ,但Java语言实际上并没有为您提供任何访问该堆栈的方法。 即使有时在极少数情况下,它也将非常有用。 一个例子 方法结果值放在堆栈中。 如果查看以下示例: public int method() {if (something)return …

C/C++ 命中率比较高的面试知识点,你都答得上来吗

点击蓝字关注我们第一部分:计算机基础1. C/C内存有哪几种类型?C中,内存分为5个区:堆(malloc)、栈(如局部变量、函数参数)、程序代码区(存放二进制代码)、全局/静态存储区(全局变量、static变量&…

linux 提示符 异常,linux终端提示符异常 bash-4.1$

/etc/profile: 此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.并从/etc/profile.d目录的配置文件中搜集shell的设置./etc/bashrc: 为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取.~/.bash_profile: 每个用户都可使用该文件…

svn: 没有演进历程信息_使用默认方法的接口演进–第二部分:接口

svn: 没有演进历程信息引入了默认方法以启用接口演进。 如果向后兼容性是不可替代的,则仅限于向接口添加新方法(这是它们在JDK中的唯一用法)。 但是,如果希望客户端更新其代码,则可以使用默认方法逐步演化接口而不会引…

蓝桥杯7届c语言 c组答案,第七届蓝桥杯C语言C组-(自己懂的题目)

第七届蓝桥杯C语言C组-(自己懂的题目)表示刚刚查了成绩,省赛一等奖,有资格去北京了,然后写一下总结,先来写一下我懂的题目,毕竟我也是菜鸟,听说国赛比预赛难几个等级。。。第一题报纸页数X星球日报和我们地…

关于多线程的几道面试题

点击蓝字关注我们第一题:线程的基本概念、线程的基本状态及状态之间的关系?线程,有时称为轻量级进程,是CPU使用的基本单元;它由线程ID、程序计数器、寄存器集合和堆栈组成。它与属于同一进程的其他线程共享其代码段、数…

c语言 想输入非数字是报错误,C语言上机练习5C言上机练习5.doc

C语言上机练习5C言上机练习5C语言上机报告5 数组2上机内容找出下列程序中的错误并改正1) /*有一个34的矩阵,要求输出其中值最大的元素的值,以及它的行号和列号。*/#include "stdio.h"#define M 3//无分号#define N 4void main( ){ int max,i,j,r,c;int a[M][N]{{323…

大牛谈嵌入式C语言的高级用法

点击蓝字关注我们内存管理我们需要知道——变量,其实是内存地址的一个抽像名字罢了。在静态编译的程序中,所有的变量名都会在编译时被转成内存地址。机器是不知道我们取的名字的,只知道地址。 内存的使用时程序设计中需要考虑的重要因素之一&…

java转换为c#_C#vs Java哪一个更快? 将25k C#转换为Java(2)

java转换为c#在上一篇文章中,我描述了如何将25k行C#转换为Java以及从该练习中学到的教训。 我收到以下问题: 顺便说一句很棒的文章。 移植代码后,性能与C#版本相比如何? 改写系统的动机之一是使系统运行更…

基于人工神经网络的识别C语言,实验一基于人工神经网络的数码识别.doc

实验一基于人工神经网络的数码识别《人工智能导论》课程基于人工神经网络的数码识别班级:计1103学号:201107010330姓名:贾梦洁成绩评定:评阅老师:日 期:实验报告正文一、实验目的?????基于神经网络的数…

博科光纤交换机java_带有光纤的可扩展,健壮和标准的Java Web服务

博科光纤交换机java这篇博客文章讨论了负载下的基准Web服务性能。 要了解有关Web服务性能理论的更多信息,请阅读利特尔定律,可伸缩性和容错 。 使用阻塞和异步IO对Web服务进行基准测试 Web应用程序(或Web服务)如何在负载下&#…

很棒的C语言入门笔记,推荐收藏!

点击蓝字关注我们c语言入门C语言一经出现就以其功能丰富、表达能力强、灵活方便、应用面广等特点迅速在全世界普及和推广。C语言不但执行效率高而且可移植性好,可以用来开发应用软件、驱动、操作系统等。C语言也是其它众多高级语言的鼻祖语言,所以说学习…