2012-05-17 82 views
0

這是我的代碼:產生隨機的長簽名ç

#include <stdio.h> 
#include <time.h> 
#include <unistd.h> 
#include <crypt.h> 
#include <string.h> 
#include <stdlib.h> 

int main(void){ 

int i; 
unsigned long seed[2]; 

/* Generate a (not very) random seed */ 
seed[0] = time(NULL); 
seed[1] = getpid()^(seed[0] >> 14 & 0x30000); 

printf("Seed 0: %lu ; Seed 1: %lu", seed[0], seed[1]); 
return 0; 
} 

我要生成將用於成散列函數的一些非常隨機種子,但我不知道該怎麼辦了!

+0

http://stackoverflow.com/questions/7920860/how-to-generate-large-random-numbers-c –

回答

3

你可以從/ dev/random中讀取你需要的隨機位。

讀取時,/ dev/random設備將只返回熵池中估計的噪聲位數內的隨機字節。/dev/random應該適用於需要非常高質量隨機性的應用,例如一次性密鑰或密鑰生成。當熵池爲空時,從/ dev/random中讀取將被阻塞,直到收集到額外的環境噪聲。(http://www.kernel.org/doc/man-pages/online/pages/man4/random.4.html )

int randomSrc = open("/dev/random", O_RDONLY); 
unsigned long seed[2]; 
read(randomSrc , seed, 2 * sizeof(long)); 
close(randomSrc); 
+0

這真是太棒了:)非常感謝! – polslinux

3

Mersenne Twister,它是一個廣泛使用的僞隨機數發生器,因爲它非常快速,具有很長的週期和非常好的分佈。不要試圖編寫自己的實現,使用任何available ones

3

由於該算法是確定性的,你不能得到隨機的,唯一的僞隨機 - 在大多數情況下,你有什麼有很多,如果你走極端如

Mac address + IP address + free space on HD + current free memory + epoch time in ms... 

那麼你就會危及算法的性能。

如果您的解決方案是交互式的,那麼您可以爲用戶設置一個簡短的輸入任務,並讓他們爲您生成隨機數據 - 測量擊鍵之間的時間並將其乘以所按鍵的代碼 - 即使它們重新輸入相同的字符串,時間會稍微偏離 - 你可以混合一點,當他們開始時只需要10秒的時間,並且只計算那些擊鍵。

但如果你真的真的想要100%隨機號碼 - 然後你可以使用ANU Quantum Vacuum Random number generator - article

a project on GitHub它打敗壞人相當真棒方式。

+0

這可能看起來是隨機的,但實際上可能有一個可怕的分佈,而不是像預期的那樣隨機。 – ClemKeirua

+0

但是量子隨機數發生器是有保證的 - 它需要海森堡的不確定性原理 - 從本質上說,你不可能知道所有事情,並問「如果我們有完美的真空,會發生什麼?」事實證明,宇宙瘋狂噴出虛擬粒子只是爲了混淆科學家。 –

+1

對不起,我在談論你的第一個解決方案(總結各種元素)。像所有物理的basec生成器一樣,量子數生成器可能有點用處:)但是它確實可以成爲生成隨機數的一種非常好的方法,因爲「真正的」高效隨機性(我的意思是不基於確定性算法)基於物理原理。 http://www.random.org/使用大氣噪音來生成數字。 – ClemKeirua