随机数发生器碰撞
问题描述:
我实现了一种随机生成自动化字母和数字的方法。随机数发生器碰撞
public static string GenerateRandomNumber()
{
using (var rng = RandomNumberGenerator.Create())
{
var bytes = new byte[8];
rng.GetBytes(bytes);
return Convert.ToBase64String(bytes);
}
}
此randomNumberGenerator类会产生碰撞的概率是多少?
答
这取决于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() –
很显然,这会产生在,如果你把它不止一次一些点碰撞......但是不可能给出正确的答案不知道你的随机数生成器,你想要的结果的数量质量。 –