以下是ASP.NET中用于创建会话ID的实现(我已经解释)。
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?
答案 0 :(得分:1)
由于在RNGCryptoServiceProvider
函数内创建了一个新的GetSessionId
对象,因此多个线程无法访问它。
修改强> 这意味着如果两个或多个线程使用其功能,它不会崩溃。它不保证任何唯一性(一个或多个线程),但会产生加密强大的随机字节。
答案 1 :(得分:1)
虽然GetBytes是线程安全的(没有死锁,没有共享结果),但使用它并不意味着每次结果都不同。
每次调用GetBytes时,都是一个全新的随机结果。这意味着它是随机的,也可能是重复的。
获得15个字节,这是不太可能的一面,但它可能会发生。