Heim >Backend-Entwicklung >C++ >Wie kann der mt19937-PRNG für eine bessere Zufallszahlengenerierung robust gesät werden?
Wie man den mt19937-PRNG robust auspflanzt
Obwohl allgemein empfohlen, weist die Verwendung von std::random_device zum Aussäen eines mt19937-PRNG zahlreiche Mängel auf, darunter unzureichende Entropie und potenzielle Ungleichmäßigkeit. In diesem Artikel wird eine Lösung vorgestellt, die diese Probleme überwindet:
Portables und gründliches Seeding
Der folgende Ansatz nutzt eine plattformspezifische Quelle kryptografischer Zufallsbytes (Sysrandom). zum Seeding des PRNG:
std::uint_least32_t seed; sysrandom(&seed, sizeof(seed)); std::mt19937 gen(seed);
sysrandom ist eine Wrapper-Funktion, die je nach Bedarf zufällige Bytes von einer geeigneten Quelle abruft auf der Plattform:
Windows:
Unix-Like:
Andere:
Durch die Verwendung von Quellen mit kryptografischer Qualität gewährleistet diese Lösung ausreichende Entropie und Gründlichkeit Seeding.
Vergleich mit Boost
Boosts random_device verwendet ähnliche Techniken (z. B. MS_DEF_PROV unter Windows, /dev/urandom unter *Nix), wodurch der vorgestellte Ansatz vergleichbar ist Portabilität und Qualität.
Linux Spezialisierung
Für zusätzliche Sicherheit unter Linux 3.17 kann getrandom (das blockiert, wenn CSPRNG nicht initialisiert ist) anstelle von /dev/urandom verwendet werden:
#if defined(__linux__)... size_t sysrandom(void* dst, size_t dstlen) { int bytes = syscall(SYS_getrandom, dst, dstlen, 0); if (bytes != dstlen) { throw std::runtime_error(...); } return dstlen; } #elif defined(_WIN32)... #else... #endif
OpenBSD Vorsichtsmaßnahme
Modernem OpenBSD fehlt /dev/urandom. Nutzen Sie stattdessen Getentropie:
#if defined(__OpenBSD__)... size_t sysrandom(void* dst, size_t dstlen) { int bytes = getentropy(dst, dstlen); if (bytes != dstlen) { throw std::runtime_error(...); } return dstlen; } #endif
Das obige ist der detaillierte Inhalt vonWie kann der mt19937-PRNG für eine bessere Zufallszahlengenerierung robust gesät werden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!