2012-08-16 60 views
0

我想生成一個長度爲9的隨機字符串。長度爲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

你對「字符串」的定義是什麼?什麼字符被允許? – 2012-08-16 08:48:14

+0

@Serg:A到Z甚至可能是0-9都可以。但我不想要其他角色。否=等 – Jack 2012-08-16 08:49:16

+0

如果發生碰撞,重新生成一個新的字符串如何? – 2012-08-16 08:56:06

回答

0

它可能表現不錯,但如果您需要一個真正的隨機數,您應該使用RandomNumberGenerator類。這給你一個加密隨機數,並且會更好地分配隨機性。當然,這隻有在你需要加密隨機字符串時才真正重要。這SO question在討論差異方面做得很好。

0

使用GUID並將其壓縮爲您喜歡的字符串。

+0

Guid是隨機的,但它的一部分不是,我想要一個隨機的字符串長度爲9.不多也不少,Guid不能保證這是隨機的 – Jack 2012-08-16 09:25:58

+0

這就是我的意思凝結」,即熬下來,這樣的獨特遺蹟。但當然這是不可能的,你會在'36^9'嘗試後最後碰撞。而且,如果沒有給出實際的算法,這並沒有太大的幫助。只是想提供一個快速提示。 – primfaktor 2012-08-16 09:41:33

0

即使使用沒有約束的完美隨機字符串,一旦生成大約200萬個條目,您可能會碰到衝突。總共有26^9個字符串。一旦你觸及大約230萬的平方根,碰撞就很可能發生。檢查出Birthday problem

你有兩個選擇:

  • 增加顯著可能的串的數目。這意味着更長的字符串,可能還有更多字符
  • 跟蹤現有值並拒絕它們。
  • 使用計數器並將其傳遞給所需大小的僞隨機置換。