这是生成一串随机字符的好方法吗?

Joh*_*ski 6 c# string random

我发现这段代码生成一串随机字符.

但有没有更优雅/更快/更可靠的方式来做到这一点?这似乎依赖于在给定当前编码的情况下数字26-91是有效字符的事实.

/// <summary>
/// Generates a random string with the given length
/// </summary>
/// <param name="size">Size of the string</param>
/// <param name="lowerCase">If true, generate lowercase string</param>
/// <returns>Random string</returns>
private string RandomString(int size, bool lowerCase)
{
    StringBuilder builder = new StringBuilder();
    Random random = new Random();
    char ch;

    for(int i = 0; i < size; i++)
    {
        ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65)));
        builder.Append(ch);
    }

    if(lowerCase)
        return builder.ToString().ToLower();

    return builder.ToString();
}
Run Code Online (Sandbox Code Playgroud)

Jon*_*eet 24

我更喜欢将Random实例传递给方法 - 然后你可以多次重复使用同一个实例,这对于你需要快速连续生成大量随机字符串很重要.但是,我还要修改一下:

public const string LowerCaseAlphabet = "abcdefghijklmnopqrstuvwyxz";
public const string UpperCaseAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

public static string GenerateUpperCaseString(int size, Random rng)
{
    return GenerateString(size, rng, UpperCaseAlphabet);
}

public static string GenerateLowerCaseString(int size, Random rng)
{
    return GenerateString(size, rng, LowerCaseAlphabet);
}

public static string GenerateString(int size, Random rng, string alphabet)
{
    char[] chars = new char[size];
    for (int i=0; i < size; i++)
    {
        chars[i] = alphabet[rng.Next(alphabet.Length)];
    }
    return new string(chars);
}
Run Code Online (Sandbox Code Playgroud)
  • 当您知道最终长度时,无需使用StringBuilder
  • 使用Random.NextDouble()表示缺乏对Random类的了解.(特别是Random.Next(int, int)
  • 在每次调用时创建一个新的Random可能会导致重复的字符串
  • 与刚刚投射相比,调用Convert.ToInt32和Convert.ToChar似乎很难看
  • 与开始使用小写字母相比,之后的下套管似乎毫无意义
  • 提供一个可供选择的字母表更灵活(通常情况下使用辅助方法)

  • Jon总是很好的答案.结合其他事情要考虑.(1)随机性是多么随机?如果攻击者知道大小,字母表以及是否重复使用相同的Random,那么从您的版本中只有一个足够长度的字符串足以推断出每个未来输出的数据.这种随机性水平不适合加密使用,生成密码等.(2)这些随机字符串是否会显示给用户?我可以想到一些用户可能会觉得冒犯或反感的随机输出.可能想要过滤粗鲁的话. (2认同)
  • 这方面的一些额外想法(重新VBScript,但问题几乎相同)在这里:http://blogs.msdn.com/gstemp/archive/2004/02/23/78434.aspx (2认同)