Ich habe mich gefragt, ob es einen Weg gibt, den neuen hardwarebasierten wahren Zahlengenerator zu nutzen, der in der sandy bridge CPU von Intel zu finden ist. Ich habe gelesen, dass MKL (Math Kernel Library) von Intel diese Funktionalität verfügbar macht, aber dies erfordert die MKL-Suite und einen Intel-Compiler, der ziemlich teuer wird.
Gibt es eine andere Möglichkeit, den Hardware-Zufallsgenerator in meinem C ++ Code zu verwenden? Zum Beispiel eine nette, nur Header-Bibliothek?
Intel hat ein Handbuch, eine Bibliothek und Codebeispiele für die Anweisung rdrand
unter Ссылка .
Aus der Readme-Datei:
"Da die vielen Compiler Toolchains diese neue Anweisung nicht unterstützen, war diese Bibliothek erstellt, um den einfachen Zugriff darauf zu erleichtern. Die Idee ist einfach: Verknüpfen Sie mit einer gebauten statischen Bibliothek und genießen Sie die neue Funktion! "
Es gibt Beispiele für alle Bibliotheksaufrufe in main.c
.
Ich konnte die statische Bibliothek und das Testprogramm in gcc unter Mac OS X kompilieren. Die Dokumentation besagt, dass es auch mit Linux und Windows kompatibel ist.
Beachten Sie, dass rdrand
tatsächlich ein 128-Bit-Pseudozufallszahlengenerator mit von der Hardware erzeugter Entropie ist. (Die kommende Broadwell-Architektur wird eine rdseed
-Anweisung bereitstellen, um auf den echten Zufallszahlengenerator zuzugreifen.) Die Details des Unterschieds und seine Auswirkungen finden Sie unter der Überschrift "Lange Antwort" unter Ссылка .
Hier ist der Beispielcode:
%Vor%Referenz: Intel Intrinsics Guide
Es könnte von Ihrem Betriebssystem abhängen. Ich könnte mir vorstellen, dass neuere GNU / Linux-Kernel die Hardware-Zufallsgeneratoren für z. /dev/random
(da die random(4)
man-Seite vorschlägt, dass es Rauschen verwendet), aber ich könnte falsch liegen.
Üblicherweise wird ein Pseudozufallsgenerator verwendet (wie zB die random(3)
Standardfunktion), aber um ihn beim Starten der Anwendung aus einer zufälligeren Quelle zu erzeugen (zB /dev/urandom
lesen,% verwenden co_de% und etwas von der aktuellen Zeit mit getpid()
, etc).
Sehr gute Zufallszahlen zu erhalten ist sehr wahrscheinlich eine schwarze Kunst, zumindest für mich. Aber die obige Lösung hat zumindest den Vorteil, dass sie von einem Anwendungslauf zu einem anderen nicht leicht reproduzierbar ist.
Wenn Ihre Anwendung langlebig ist (z. B. ein Webdienst, der mehrere Stunden lang in demselben Prozess ausgeführt wird), können Sie Ihren Pseudo-Zufallszahlengenerator möglicherweise von Zeit zu Zeit erneut einsetzen. Für einen Webserver könnte ich mir vorstellen, dass Sie auch Anforderungszeiten (die mit der Granularität im Millisekundenbereich gemessen werden) als Quelle der Zufälligkeit verwenden können (um Ihre PRNG zu säen).