繁体   English   中英

随机数生成器碰撞

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM