我想生成一个长度为9的随机字符串。
这是碰撞大约10-15次的代码。致Random String Generator Returning Same String的积分。任何人都可以帮我生成一个真正的随机字符串吗?
class Program
{
private static Random random = new Random((int)DateTime.Now.Ticks);
private static object locker = new object();
private static string RandomString(int size)
{
StringBuilder builder = new StringBuilder();
char ch;
for (int i = 0; i < size; i++)
{
lock (locker)
{
ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65)));
}
builder.Append(ch);
}
return builder.ToString();
}
static void Main(string[] args)
{
Dictionary<string, string> dict = new Dictionary<string, string>();
object locker2 = new object();
ThreadPool.QueueUserWorkItem(new WaitCallback((obj) => {
for (int i = 0; i < 5000000; i++)
{
string random = RandomString(9);
lock (locker2)
{
if (!dict.ContainsKey(random))
dict[random] = random;
else
Console.WriteLine("Found");
}
}
}));
ThreadPool.QueueUserWorkItem(new WaitCallback((obj) =>
{
for (int i = 0; i < 5000000; i++)
{
string random = RandomString(9);
lock (locker2)
{
if (!dict.ContainsKey(random))
dict[random] = random;
else
Console.WriteLine("Found");
}
}
}));
ThreadPool.QueueUserWorkItem(new WaitCallback((obj) =>
{
for (int i = 0; i < 5000000; i++)
{
string random = RandomString(9);
lock (locker2)
{
if (!dict.ContainsKey(random))
dict[random] = random;
else
Console.WriteLine("Found");
}
}
}));
ThreadPool.QueueUserWorkItem(new WaitCallback((obj) =>
{
for (int i = 0; i < 5000000; i++)
{
string random = RandomString(9);
lock (locker2)
{
if (!dict.ContainsKey(random))
dict[random] = random;
else
Console.WriteLine("Found");
}
}
}));
Console.ReadKey();
}
}
答案 0 :(得分:0)
它可能也有效,但是如果你需要一个真正随机的数字,你应该使用RandomNumberGenerator类。这为您提供了一个加密随机数,并且可以更好地分配随机数。当然,这只有在你需要加密随机字符串时才真正重要。这个SO question在讨论差异方面做得很好。
答案 1 :(得分:0)
使用GUID并将其浓缩为您喜欢的字符串。
答案 2 :(得分:0)
即使使用没有约束的完美随机字符串,一旦生成大约200万个条目,您可能会发生冲突。共有26 ^ 9个字符串。一旦你碰到平方根,大约有230万,就会发生碰撞。查看Birthday problem。
您有几个选择: