.NET で関数をコーディングして、シードに基づいて GUID を生成し、その一意性についてより信頼できるようにする最も簡単な方法は何ですか?
string GenerateSeededGuid(int seed) { /* code here */ }
理想的には、シードは次のように乱数生成を記述するCryptGenRandomから取得されます。
この関数によって生成されるデータは、暗号的にランダムです。これは、C コンパイラに同梱されている乱数ジェネレータなどの一般的な乱数ジェネレータによって生成されるデータよりもはるかにランダムです。
この関数は、ランダムな初期化ベクトル とソルト値を生成するためによく使用されます。
ソフトウェア乱数ジェネレーターは、基本的に同じように機能します。シードと呼ばれる乱数から開始し、アルゴリズムを使用してそれに基づいてビットの疑似乱数シーケンスを生成します。このプロセスの最も難しい部分は、真にランダムなシードを取得することです。これは通常、ユーザー入力の遅延、または 1 つ以上のハードウェア コンポーネントからのジッターに基づいています。
Microsoft CSP では、CryptGenRandomは、他のセキュリティ コンポーネントで使用されるのと同じ乱数ジェネレーターを使用します。これにより、多数のプロセスがシステム全体のシードに貢献できます。CryptoAPI は、すべてのユーザーに中間ランダム シードを格納します。乱数ジェネレーターのシードを形成するために、呼び出し元のアプリケーションは、マウスやキーボードのタイミング入力などのビットを提供し、保存されているシードとさまざまなシステム データおよびプロセス ID などのユーザー データと組み合わせます。スレッド ID、システム クロック、システム時刻、システム カウンター、メモリ ステータス、空きディスク クラスター、ハッシュされたユーザー環境ブロック。この結果は、疑似乱数ジェネレーター (PRNG) のシードに使用されます。[...] アプリケーションが適切なランダム ソースにアクセスできる場合、CryptGenRandomを呼び出す前に、いくつかのランダム データを含む pbBufferバッファー。次に、CSP はこのデータを使用して、内部シードをさらにランダム化します。CryptGenRandomを呼び出す前にpbBufferバッファを初期化するステップを省略しても かまいません。