随机数发生器碰撞

问题描述:

我实现了一种随机生成自动化字母和数字的方法。随机数发生器碰撞

public static string GenerateRandomNumber() 
{ 
    using (var rng = RandomNumberGenerator.Create()) 
    { 
     var bytes = new byte[8]; 

     rng.GetBytes(bytes); 

     return Convert.ToBase64String(bytes); 
    } 
} 

此randomNumberGenerator类会产生碰撞的概率是多少?

+0

很显然,这会产生在,如果你把它不止一次一些点碰撞......但是不可能给出正确的答案不知道你的随机数生成器,你想要的结果的数量质量。 –

这取决于RandomNumberGenerator的实现,但现在,我在考虑碰撞的概率是100%,因为您正在为每个调用实例化一个新实例。如果您使用的是System.Random,则会是这种情况... try it out on DotNetFiddle

public class Program 
{ 
    public static string RandomNumber() 
    { 
     var rng = new System.Random(); 
     var bytes = new byte[8]; 

     rng.NextBytes(bytes); 

     return Convert.ToBase64String(bytes); 
    } 

    public static void Main() 
    { 
     Console.WriteLine(RandomNumber()); 
     Console.WriteLine(RandomNumber()); 
    } 
} 

输出(哎呀!):

EgNMBvntr1w= 
EgNMBvntr1w= 

我的建议是,以实例的RandomNumberGenerator只有一个实例,并将其保持在一个静态变量在整个程序的寿命。如果你这样做,赔率将更像2^64中的1。

public class Program 
{ 
    private static readonly rng = new System.Random(); 

    public static string RandomNumber() 
    { 
     var bytes = new byte[8]; 

     rng.NextBytes(bytes); 

     return Convert.ToBase64String(bytes); 
    } 

    public static void Main() 
    { 
     Console.WriteLine(RandomNumber()); 
     Console.WriteLine(RandomNumber()); 
    } 
} 
+0

只是为了澄清我使用的随机数生成器属于System.Security.Criptography.Algorithms命名空间C#语言而不是Sytem.Random() –