0

以下は、セッション ID を作成するための ASP.NET での実装です (言い換えました)。

編集 (RNG は共有されます):

static _randgen = new RNGCryptoServiceProvider(); 

string GetSessionId()
{
    var buffer = new byte [15];

    //fill the buffer with random bytes
    randgen.GetBytes(buffer);

    //turn the bytes into a string of letters and numbers (no unsafe chars)
    string encoding = Encode(buffer);
    return encoding; 
}

のドキュメントにRNGCryptoServiceProvider.GetBytesは、スレッドセーフであると書かれていますが、それがどのような種類のスレッドセーフを意味するのかは明確ではありません。デッドロックがないことを保証するだけですか、それとも 2 つのスレッドが異なる値を取得することを保証しますか? 2 つのリクエストが同じセッション ID を取得するという競合状態が発生する可能性はありますか?

4

2 に答える 2

1

関数内で新しいRNGCryptoServiceProviderオブジェクトが作成されるためGetSessionId、マルチスレッドによるアクセスではありません。

編集: 2 つ以上のスレッドがその関数を使用してもクラッシュしないことを意味します。一意性 (1 つ以上のスレッド) は保証されませんが、暗号的に強力なランダム バイトが生成されます。

于 2012-04-18T20:09:12.113 に答える
1

GetBytes はスレッド セーフ (デッドロックなし、結果の共有なし) ですが、これを使用しても結果が毎回異なるというわけではありません。

GetBytes を呼び出すたびに、まったく新しいランダムな結果になります。ランダムであるということは、重複することもあるということです。

確かに 15 バイトで、それはありそうもない側面のタッチですが、発生する可能性があります。

于 2012-04-18T20:35:48.840 に答える