2013-07-17 14 views
5

Chcę napisać program do generowania naprawdę losowej liczby przy użyciu /dev/random na Linuksie, ale później uważam, że czas jego działania jest czasami nie do przyjęcia. Wersja C działa szybko.plik io z/dev/random trwa zbyt długo

#include <iostream> 
#include <fstream> 
using namespace std; 
int main(int argc,char*argv[]) 
{ 
    ifstream random("/dev/random", ios_base::in); 
    int t; 
    random.read(reinterpret_cast<char*>(&t), sizeof(t)); 
    cout << t << endl; 
    random.close(); 
    return 0; 
} 

Statystykę czas czas

$: time ./random 
-1040810404 

real 0m0.004s 
user 0m0.000s 
sys 0m0.000s 

$: time ./random 
-1298913761 

real 0m4.119s 
user 0m0.000s 
sys 0m0.000s 
+0

"naprawdę losowa liczba" nie ma czegoś takiego w całym świecie informatyki, wyjaśnij się lepiej. – user2485710

+3

'/ dev/random' zależy od interakcji i innych zdarzeń typu sprzętowego dla danych. Oznacza to, że jest dość losowy, ale także, że czasami trzeba czekać (jak już widzieliście, czasami długo trzeba czekać nawet na kilka bajtów). Twoja wersja C prawdopodobnie używa '/ dev/urandom' zamiast'/dev/random'. – Corbin

+0

@Corbin tego posta jest oznaczony jako "C++" ... Nadal nie rozumiem ... – user2485710

Odpowiedz

7

Masz prawdopodobnie osuszony puli losowej uruchomiony. Tworzenie entropii (ok. Zbiorów) opiera się na sterownikach urządzeń, które próbkują jakości świata fizycznego, które są w większości nieprzewidywalne. Ale jeśli te urządzenia nie są bardzo aktywne lub jeśli algorytm wytwarzający entropię przestanie działać, twoje odczyty z /dev/random też będą.

Czy możesz użyć /dev/urandom? Jeśli nie, powinieneś popatrzeć na sposoby, dzięki którym możesz produkować więcej entropii w bardziej deterministyczny sposób.

Oto kilka sugestii od article regarding a similar problem:

  • Zaangażowanie audio demona entropii takiego jak AED zebrać hałas z centrum przetwarzania danych z otwartego mikrofonu, może połączyć go z kolektorem hałasu webcam jak VED. Inne źródła mówią o "losowości kryptograficznej z turbulencji powietrza w urządzeniach dyskowych". :)
  • Użyj demona Entropy Gathering, aby zebrać słabszą entropię z losowości programów przestrzeni użytkownika.
+3

Ponadto, 'std :: ifstream' jest domyślnie buforowany, więc jest całkiem prawdopodobne, że każde uruchomienie programu próbuje odczytać kilka KB danych do bufora plików, co spowoduje drożenie puli wielkości entropii o wartość większą niż odczyt 4 bajty na uruchomienie programu. –

+0

@AdamRosenfield Jeśli wejście C nie jest zbuforowane jako niebotycznie (nie jestem pewien OTOH), może to wyjaśnić różnicę między różnymi językami. – michaelb958

+0

Odpowiedź IMO @ AdamRosenfield jest prawdopodobną "poprawną" odpowiedzią. 'setbuf (0, 0)' jest prawdopodobnie tym, co chce OP. –

Powiązane problemy