long long
暗号強度С++でランダムを生成するソリューションは何ですか? (ブーストは許可されています)
2 に答える
<random>
ヘッダーは、潜在的に暗号 pRNG を含む乱数機能へのポータブル アクセスを提供します。
#include <random> // random_device, uniform_int_distribution
#include <algorithm> // generate_n
#include <iterator> // ostream_iterator
#include <iostream> // cout
#include <functional> // bind, ref
int main() {
std::random_device r;
std::uniform_int_distribution<long long> dist;
std::generate_n(std::ostream_iterator<long long>(std::cout, "\n"), 10,
std::bind(dist,std::ref(r)));
}
std::random_device
すべての実装で暗号化 pRNG ではない可能性があるため、実装のドキュメントを確認する必要があります。特に、2012 年より前の VC++ は、非決定論的な実装を提供していません。VC++ 2012 以降では、Windows 暗号化サービスを使用してこれを実装しています。
Linux や Mac OS X などの他のオペレーティング システムでの実装では、通常、「/dev/urandom」または「/dev/random」、またはファイル システムを介して公開されているその他の任意のデバイスを使用できます。たとえば、libc++ はデフォルトで "/dev/urandom" を使用しますが、これは OS X では Yarrow アルゴリズムを使用します。
ブーストを除外したことは知っていますが、boost::random_device
そのプラットフォームの暗号化サービスを使用する Windows の実装があります。
/dev/random
Linuxでは、またはから読み取ることができます/dev/urandom
どちらも暗号エントロピーを提供します。
それらの違いは次のとおりです。/dev/random
エントロピーが使い果たされた場合はブロックされるため、より遅くなる可能性がありますが/dev/urandom
、「強い」です
したがって、ストリームを使用すると、次のようになります
long long n;
std::ifstream rstream ("/dev/random");
rstream >> n;