[英]Random number generator collision
我实现了一种以随机方式生成自动字母和数字的方法。
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,那就是这种情况……在 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());
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.