博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
利用/dev/urandom文件创建随机数
阅读量:4602 次
发布时间:2019-06-09

本文共 1437 字,大约阅读时间需要 4 分钟。

1:/dev/urandom和/dev/random是什么

  这两个文件记录Linux下的熵池,所谓熵池就是当前系统下的环境噪音,描述了一个系统的混乱程度,环境噪音由这几个方面组成,如内存的使用,文件的使用量,不同类型的进程数量等等,刚开机的时候系统噪音会较小。在这两个设备的差异在于:/dev/random的random pool依赖于系统中断,因此在系统的中断数不足时,/dev/random设备会一直封锁,尝试读取的进程就会进入等待状态,直到系统的中断数充分够用, /dev/random设备可以保证数据的随机性。/dev/urandom不依赖系统的中断,也就不会造成进程忙等待,但是数据的随机性也不高。

2:获取/dev/urandom和/dev/random中的值

  command:dd count=1 ibs=1024 if=/dev/urandom >/dev/null

  

  command:dd count=1 ibs=1024 if=/dev/random >/dev/null

  

 可以看见/dev/urandom生成随机数的速度要快很多,一般就使用/dev/urandom获取随机数。

3:如何利用/dev/urandom生成随机数

  3.1 srand()和rand()

  这两个函数是Linux下生成随机数的函数(unsigned long的随机数),rand()函数返回的随机数位于0到RAND_MAX之间,因为这之间的距离很长,所以从中取出一段来可以被认为是随机数,哪取出一段来的起始位置是哪里呢?这个起始位置也叫做随机种子,这个时候srand()函数就派上用场了,它就是用来决定从哪里开始取的,如果rand()之前没有使用srand()设置随机种子,就默认随机种子为1,而且下一次再调用rand()取出的随机数和上次一样,所以要每次取出不一样的随机数就需要每次rand()之前调用srand()设置和上次不同的随机种子。

unsigned long random_xid(void){    static int initialized;    if (!initialized) {        int fd;        unsigned long seed;        fd = open("/dev/urandom", 0);        if (fd < 0 || read(fd, &seed, sizeof(seed)) < 0) {            LOG(LOG_WARNING, "Could not load seed from /dev/urandom: %s",                strerror(errno));            seed = time(0);        }        if (fd >= 0) close(fd);     //设置随机种子        srand(seed);     //下次取同样的随机数        initialized++;    }    return rand();}// 实例是udhcp源码中dhcp client生成xid的过程(因为xid在一次事务中是不变的所以只取一次随机数)。

 

转载于:https://www.cnblogs.com/guxuanqing/p/9591047.html

你可能感兴趣的文章
js中的call、apply、bind
查看>>
css中".",",",“~”和“>”符号的意义
查看>>
webControls与客户端脚本路径
查看>>
JavaScript 实现常见数据结构 —— 数组
查看>>
Deepin 系统下安装VMware并激活
查看>>
jquery 鼠标划过显示弹出层效果
查看>>
集合类接口
查看>>
Redis系列十:缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级
查看>>
eclipse代码自动提示设置、如何配置eclipse的代码自动提示功能(同时解决自动补全变量名的问题)?...
查看>>
给mysql表增加字段 create_time 自动插入当前时间
查看>>
XML笔记
查看>>
mCustomScrollbar
查看>>
AngularJs学习笔记--Creating Services
查看>>
《JS高级程序设计》之六
查看>>
纯静态文件环境下的Nginx优化思路
查看>>
centos 查看mysql数据库命令
查看>>
差异演化
查看>>
2013年读书计划
查看>>
Head First Servlet and JSP 笔记 JSP 部分 (未完待续)
查看>>
内置函数,递归函数和匿名函数
查看>>