利用/dev/urandom文件创建随机数

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()设置和上次不同的随机种子。

  3.2 实例

 

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在一次事务中是不变的所以只取一次随机数)。

参考文章1

参考文章2

转载地址: https://www.cnblogs.com/Flychown/p/6868520.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值