如何穩健地播種mt19937 PRNG
雖然通常建議使用std::random_device 播種者mt19937 PRNG 有許多缺點,包括熵不足的不均勻性。本文提出了一個克服這些問題的解決方案:
便攜式和徹底的播種
以下方法利用特定於平台的加密強度隨機字節來源(sysrandom)播種PRNG:
std::uint_least32_t seed; sysrandom(&seed, sizeof(seed)); std::mt19937 gen(seed);
sysrandom是一個包裝函數,用於從適當的來源,取決於平台:
Windows:
類Unix:
其他:
透過依賴在加密品質來源上,該解決方案確保足夠的熵和徹底的
與Boost 的比較
Boost 的 random_device 採用類似的技術(例如,Windows 上的 MS_DEF_PROV,*Nix 上的 /dev/urandom),使得所提出的方法在可移植性和品質。
Linux專業化
為了在 Linux 3.17 上增加安全性,可以使用 getrandom (如果 CSPRNG 未初始化則阻塞)代替/dev/urandom:
#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警告
現代 OpenBSD 缺乏/dev/urandom。使用 getentropy 取代:
#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
以上是如何穩健地播種 mt19937 PRNG 以實現更好的隨機數產生?的詳細內容。更多資訊請關注PHP中文網其他相關文章!