從Linux內核中獲取真隨機數(shù)
[38070.575481] We get random number: 240443446
[38070.575485] We get random number: -606998911
[38070.575489] We get random number: 538794850
[38070.575493] We get random number: -500786675
[38070.575497] We get random number: -1240394927
[38070.575501] We get random number: 1233931345
[38070.575504] We get random number: 1488497117
[38070.575508] We get random number: -177688514
/dev/random /dev/urandom
這兩個特殊設備都是字符型設備。我們可以在用戶空間通過read系統(tǒng)調用讀這兩個設備文件以此獲取隨機數(shù)。這兩個設備文件的區(qū)別在于:如果內核熵池的估計值為0時,
/dev/random將被阻塞,而/dev/urandom不會有這個限制。
#include
#include
#include
#include
#include
/* 從min和max中返回一個隨機值 */
int random_number(int min, int max)
{
static int dev_random_fd = -1;
char *next_random_byte;
int bytes_to_read;
unsigned random_value;
assert(max > min);
if (dev_random_fd == -1)
{
dev_random_fd = open(/dev/random, O_RDONLY);
assert(dev_random_fd != -1);
}
next_random_byte = (char *)random_value;
bytes_to_read = sizeof(random_value);
/* 因為是從/dev/random中讀取,read可能會被阻塞,一次讀取可能只能得到一個字節(jié),
* 循環(huán)是為了讓我們讀取足夠的字節(jié)數(shù)來填充random_value.
*/
do
{
int bytes_read;
bytes_read = read(dev_random_fd, next_random_byte, bytes_to_read);
bytes_to_read -= bytes_read;
next_random_byte += bytes_read;
}while(bytes_to_read > 0);
return min + (random_value % (max - min + 1));
}
同樣,還可以用dd命令從/dev/urandom中獲取指定字節(jié)數(shù)的隨機值并寫入文件中保存--如果你需要以文件的形式提供隨機數(shù)的話。
dd if=/dev/urandom of = file count = 1 bs = bytes
評論