【问题标题】:generating a batch of random passwords生成一批随机密码
【发布时间】:2011-04-18 09:25:45
【问题描述】:

生成随机密码很容易。但是生成批次比较困难。

    public static string getRandomPassword(int letters, int getallen) {
        //int letters = 8;
        //int getallen = 5;

        char[] letterdeel = new char[letters];
        int minGetal = (int)Math.Pow(10, getallen - 1);
        int maxGetal = (int)Math.Pow(10, getallen);

        string password;
        Random r = new Random();
        int test = (int)(DateTime.Now.Ticks);
        for (int i = 0; i < letters; i++) {
            r = new Random((int)(DateTime.Now.Ticks) + i);
            bool capital = r.Next(2) == 0 ? true : false;
            if (capital) {
                letterdeel[i] = (char)r.Next(65, 91);
            } else {
                letterdeel[i] = (char)r.Next(97, 123);
            }
        }

        password = new string(letterdeel);
        password += r.Next(minGetal, maxGetal);

        return password;
    }

这是我的方法,密码应该是一定的字母数字格式。 这很好用,但是如果我有一个 for 循环从这个方法中提取 100 个密码,在我的数组中我有 5-8 个相同的密码,然后再有 5-8 个相同的密码。

我知道这是为什么,因为它依赖于随机函数和时钟,但我该如何解决这个问题?

【问题讨论】:

    标签: c# passwords random


    【解决方案1】:

    如果您重复调用它,请将Random r 移到方法之外。您将在相同的相对时间范围内多次击中它,因此您将生成相同的种子。您还想摆脱下面的行。这是不必要的,并且(再次)with the nature of DateTime.Now,您将继续生成相同的“随机”数字序列。

    r = new Random((int)(DateTime.Now.Ticks) + i); 
    

    【讨论】:

    • 这就是我添加i 的原因。把它放在外面确实是最好的选择。
    • 是的,但作为解释,添加 i 仍会产生相同的种子和序列。考虑DateTime.Now 将通过几个方法调用保持不变。例如,假设 DateTime.Now.Ticks 在第一次调用方法时为 0 以作为参数。对于此方法的前几次执行,它会发生得如此之快,以至于 DateTime.Now 尚未更新为新值(请参阅博客文章)。因此,您在方法内的循环将始终经过 0、1、2、3、4 等。每次执行该方法时使用相同的种子,由 Random 对象产生相同的序列。
    【解决方案2】:

    将您的随机数生成器定义为函数外部的静态变量。

    How can I get true randomness in this class without Thread.Sleep(300)?

    【讨论】:

    • 你告诉我如何用静态将它整齐地放在方法之外。谢谢。
    【解决方案3】:

    使用集合而不是您存储的任何集合,并且不要循环 100 次,直到集合中有 100 个项目。

    【讨论】:

      猜你喜欢
      • 2011-09-05
      • 2010-09-08
      • 2012-11-06
      • 2015-04-13
      • 2012-07-28
      • 2018-11-01
      • 2014-12-27
      相关资源
      最近更新 更多