长度为9的随机字符串命中碰撞

时间:2012-08-16 08:42:16

标签: c# .net

我想生成一个长度为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();
        }
    }

3 个答案:

答案 0 :(得分:0)

它可能也有效,但是如果你需要一个真正随机的数字,你应该使用RandomNumberGenerator类。这为您提供了一个加密随机数,并且可以更好地分配随机数。当然,这只有在你需要加密随机字符串时才真正重要。这个SO question在讨论差异方面做得很好。

答案 1 :(得分:0)

使用GUID并将其浓缩为您喜欢的字符串。

答案 2 :(得分:0)

即使使用没有约束的完美随机字符串,一旦生成大约200万个条目,您可能会发生冲突。共有26 ^ 9个字符串。一旦你碰到平方根,大约有230万,就会发生碰撞。查看Birthday problem

您有几个选择:

  • 显着增加可能字符串的数量。这意味着更长的字符串,可能还有更多的字符
  • 跟踪现有值,并拒绝它们。
  • 使用计数器并将其传递给所需大小的伪随机排列。