用于生成随机码的类

时间:2014-04-07 09:06:25

标签: c# asp.net datetime random calendar

我写这个类来生成一个随机代码,它不应该创建任何两个重复的数字。 我想知道,在这段代码中,我们碰撞的可能性有多大?

 public string MyRandom()
 {
    Random r = new Random();
    int x = r.Next(1000);//Max range
    PersianCalendar pc = new PersianCalendar();
     string _myrandom = pc.GetMonth(DateTime.Now).ToString() + pc.GetDayOfMonth(DateTime.Now).ToString() + pc.GetHour(DateTime.Now).ToString() + pc.GetMinute(DateTime.Now).ToString() + pc.GetSecond(DateTime.Now).ToString() + pc.GetMilliseconds(DateTime.Now).ToString() + x.ToString();

    return _myrandom;
 }

3 个答案:

答案 0 :(得分:0)

如果我们这样做

List<string> s = new List<string>();

for(int i = 0; i < 100; i++)
{
    s.Add(MyRandom());
}

<强>为什么吗 在循环中创建随机类时,您可以获得重复的随机数。 More Info

<强>解决方案: 在循环外创建随机实例。

答案 1 :(得分:0)

使用更强大的方法更安全,例如RNGCryptoServiceProvider,你可以找到它的几个使用样本。一般来说,纯随机生成不可能是非常高的并发负载,但将其概率降低到合理的数量。

答案 2 :(得分:0)

首先,因为您使用的是日期,所以每年只有一个毫秒可能会重复_myrandom字符串。

在每年的毫秒内,击中你已经生成的随机字符串的几率下降到变量x,并且直接与你在那毫秒内所做的其他随机字符串的数量有关(以及之前每毫秒的前几毫秒)年)。例如,如果你去年在那一毫秒和前一年有4个随机字符串,那么今年复制的可能性是14:999,这可能是大约1.4%。

当然,如果你每毫秒制作1000个字符串,重复的可能性是100%。

事实上,由于C#随机数生成器不生成真正的随机数,重复的可能性略高。这是一个伪随机数,因此碰撞的可能性更高。


我看到你写的:“这个生成器用于命名上传到我的应用程序中的照片”在上面的评论中,这使得你不可能每毫秒制作1000多个名字。通常,每当您以这种方式使用随机数生成器时,最好以两种方式之一进行一些错误检查: 1.进攻性或2.防守性

攻击性是等待错误(两个相同的文件名)发生然后处理它(可能再次运行你的随机生成器,直到没有抛出错误)。防御性的是检查文件中的所有文件名,或者保留所有文件名列表,以便在您尝试保存之前检查新文件名是否相同。这更加不透水(因为你不依赖于抛出错误)但计算成本更高。