0

我想生成一个长度为 9 的随机字符串。

这是大约 10-15 次碰撞的代码。归功于返回相同字符串的随机字符串生成器。谁能帮我生成一个真正随机的字符串?

  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();
        }
    }
4

3 回答 3

1

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

你有几个选择:

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

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

于 2012-08-16T09:24:03.907 回答
0

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

于 2012-08-16T09:16:58.377 回答