初探/dev/random

以前我以为比较基本的产生随机数的方法就是用C语言中的srand()和rand()函数。但是最近我发现除了这种方法之外,还有使用起来几乎一样简单的方法,就是读取/dev/random设备文件。

以前要生成随机数,通常首先用srand()设定种子。为了要每次运行的结果不一样,种子也必须不同。所以比较简单的方法就是利用time()函数返回当前的时间作为种子。如果希望随机性更大一些,则种子设定时也可以考虑其他因素,比如目前内存的使用数目,甚至同时包含好几个因素。

/dev/random
/dev/random

最近,我发现了有一种更简便,但是效果要更好的方法,就是使用字符型设备文件/dev/random。据Wikipedia说,是Linux首先实现了这个设备文件,不过现在其他Unix-like的系统也能找到。使用这个文件产生随机数很简单,就是先打开这个文件,然后读取里面的字节就可以了。它的优点是随机数质量非常高,甚至可以用在一次性加密的环境下,我的理解是它跟伪随机数产生器还是有点区别。不过读取这个文件需要注意要使用二进制的读取方式,用fread库函数,或者read系统调用,因为字节中可能有各种字符。另外,/dev/random不能并发打开,如果要并发打开,据说可以使用/dev/urandom,u表示unlock。

Advertisements

发表评论

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / 更改 )

Twitter picture

You are commenting using your Twitter account. Log Out / 更改 )

Facebook photo

You are commenting using your Facebook account. Log Out / 更改 )

Google+ photo

You are commenting using your Google+ account. Log Out / 更改 )

Connecting to %s