2013-07-17 5 views
5

Ich möchte ein Programm schreiben, um wirklich Zufallszahl mit /dev/random auf Linux zu generieren, aber später finde ich die Laufzeit ist es durchaus akzeptabel inakzeptabel. C-Version davon läuft schnell konsistent.Datei io mit/dev/Random dauert zu lang

#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; 
} 

Die Zeitstatistik von

Laufzeit
$: 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

„wirklich Zufallszahl“ nicht so etwas in der gesamten Informatik-Welt, erklären sich in besseren Konditionen – user2485710

+3

'/ dev/random' für Daten auf interupts und andere Hardware-Typ Ereignissen abhängt. Dies bedeutet, dass es ziemlich zufällig ist, aber auch, dass Sie manchmal warten müssen (wie Sie gesehen haben, ist es manchmal eine lange Zeit, die Sie sogar für ein paar Bytes warten müssen). Ihre C-Version benutzt wahrscheinlich '/ dev/urandom' statt'/dev/random'. – Corbin

+0

@Corbin Dieser Beitrag ist mit "C++" getaggt ... Ich verstehe immer noch nicht den Punkt ... – user2485710

Antwort

7

Sie die Entropiepool wahrscheinlich abgelassen haben. Die Erzeugung der Entropie (ok harvesting) basiert auf Gerätetreibern, die Eigenschaften der physikalischen Welt abtasten, die meist unvorhersehbar sind. Aber wenn diese Geräte nicht sehr aktiv sind oder wenn der Entropie erzeugende Algorithmus zum Stillstand kommt, wird dies auch von /dev/random gelesen.

Können Sie /dev/urandom verwenden? Wenn nicht, sollten Sie nach Möglichkeiten suchen, wie Sie mehr Entropie auf eine deterministischere Weise erzeugen können.

Hier sind einige Vorschläge, von einem article regarding a similar problem:

  • Beteiligen einen Audio-Entropie-Dämon wie AED Rauschen aus Ihrem Rechenzentrum mit einem offenen Mikrofon zu sammeln, vielleicht ist es mit einem wie VED Webcam Lärm Sammlern kombinieren. Andere Quellen sprechen über "kryptografische Zufälligkeit von Luftturbulenzen in Plattengeräten". :)
  • Verwenden Sie den Entropy Gathering Daemon, um schwächere Entropie aus der Zufälligkeit von Userspace-Programmen zu sammeln.
+3

Außerdem ist ein 'std :: ifstream' standardmäßig gepuffert, daher ist es sehr wahrscheinlich, dass jeder Programmlauf versucht, mehrere KB Daten in den Dateipuffer zu lesen, was den Entropiepool um Größenordnungen schneller als das Lesen ablenkt 4 Bytes pro Lauf des Programms. –

+0

@AdamRosenfield Wenn der C-Eingang nicht als exorbitant gepuffert wird (nicht sicher OTOH), könnte das den sprachübergreifenden Unterschied erklären. – michaelb958

+0

IMO @ AdamRosenfields Antwort ist die wahrscheinliche "richtige" Antwort. 'setbuf (0, 0)' ist wahrscheinlich das, was OP will. –