2

如何创建包含字母和数字的随机 X 长度字符串。我的快速解决方案是:

Guid.NewGuid().ToString("N").Substring(X);

还有什么更好的主意吗?

4

3 回答 3

2

GUID 不是随机的,它们是独一无二的!如果您在需要随机性的地方使用它们,那么您做错了什么。

随机数据生成有多种选择,但这里的问题是:它意味着什么?掷骰子?加密国家机密?

于 2012-09-19T11:38:05.380 回答
2

如果您想要字典键的“随机”字符串,只需使用Guid. 它们将是独一无二的,并且对于键入字典来说绰绰有余。


类似的东西会起作用,但你需要限制你的随机范围以避免恶作剧:

警告,对其进行编码并运行一次 - 否则未经测试。与您当前的解决方案相比,性能是无法量化的。此外,此实现比问题评论中链接的答案要冗长得多。

    static void Main(string[] args)
    {
        Random r = new Random();

        int x = r.Next(1, 1000);

        char[] pool = new[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z' };
        char[] word = new char[x];

        for (int i = 0; i < x; i++)
        {
            // max value is not inclusive, so no -1 from length.
            int a = r.Next(pool.Length); 
            word[i] = pool[a];
        }

        Console.WriteLine(new string(word));
        Console.ReadLine();
    }

使用 ASCII 码可能有更好的方法来做到这一点,但是嗯。

于 2012-09-19T11:41:35.070 回答
1

我曾经制作了一个“随机”密码生成器,它看起来像这样。你可以随意修改它,这里可能有一些 linq 表达式的空间。

public static string GeneratePassWord(bool useNumbers,bool useLetters, bool useUpperAndLowerCase, bool useSpecialCharacters, int passwordLength)
{
    Random randomNumber = new Random();
    List<char> chars = new List<char>();

    if (useNumbers) // Add numbers
    {
        for (int i = 0; i <= 9; i++)
        {
            chars.Add((char)(48 + i));
        }
    }

    if (useLetters) // Add letters
    {
        for (int i = 0; i <= 25; i++) // Small letters
        {
            chars.Add((char)(97 + i));
        }
        if (useUpperAndLowerCase)
        {
            for (int i = 0; i <= 25; i++) // Large letters
            {
                chars.Add((char)(65 + i));
            }
        }
    }

    if (useSpecialCharacters) // Add specials
    {
        chars.Add((char)'!');
        chars.Add((char)'#');
        chars.Add((char)'%');
        chars.Add((char)'&');
        chars.Add((char)'_');
        chars.Add((char)'.');
        chars.Add((char)'+');
        chars.Add((char)'@');
        chars.Add((char)'$');
    }

    // Generate random password from char
    if (chars.Count > 0)
    {
        StringBuilder newPass = new StringBuilder();
        for (int i = 0; i <= passwordLength; i++)
        {
            newPass.Append(chars[randomNumber.Next(chars.Count)]);
        }
        return newPass.ToString();
    }
    else
    {
        return string.Empty;
    }
}

如您所见,它基本上创建了一个 List<> 字符,然后从列表中随机选择您想要的每个字符数。

于 2012-09-19T11:50:02.097 回答