0

下面是 ASP.NET 中用于创建会话 id 的实现(我已经解释过)。

编辑(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 个请求会拉取相同会话 ID 的竞争条件?

4

2 回答 2

1

RNGCryptoServiceProvider由于在函数内部创建了一个新对象GetSessionId,因此它不能被多个线程访问。

编辑: 这意味着如果两个或更多线程使用它的功能,它不会崩溃。它不保证任何唯一性(一个或多个线程),但会生成加密强的随机字节。

于 2012-04-18T20:09:12.113 回答
1

虽然 GetBytes 是线程安全的(没有死锁,没有共享结果),但使用它并不意味着每次结果都不同。

每次调用 GetBytes,都是一个全新的随机结果。这意味着要随机,它也可能是重复的。

授予 15 个字节,这是不太可能的一面,但它可能会发生。

于 2012-04-18T20:35:48.840 回答