如何生成随机的字母数字字符串?

1303

我该如何在C#中生成一个包含8个随机字母和数字的字符串?


2
你对字符集有什么限制吗?只能使用英文字符和0-9数字吗?可以混合大小写吗? - Eric J.
8
也许是前往https://dev59.com/MnRB5IYBdhLWcg3wET1J或https://dev59.com/C3NA5IYBdhLWcg3wBpBm。 - Jonas Elfström
9
请注意,生成密码时不应使用基于“Random”类的任何方法。因为“Random”的种子熵非常低,所以它并不真正安全。对于密码,应该使用加密伪随机数生成器(PRNG)。 - CodesInChaos
2
最好在这个问题中包含语言本地化。特别是如果你的GUI需要为中文或保加利亚语提供支持! - Peter Jamsmenson
22
这么多赞和高质量回答的内容不应该被标记为关闭。我投票支持重新开放它。 - John Coleman
显示剩余4条评论
38个回答

1
如果您只需要一个最大长度为32(Guid长度)的字母数字字符串,可以使用简单的一行代码。
public static string RandomGuidString(int length) => Guid.NewGuid().ToString("N").Substring(0, length);

为了让它更安全,你也可以加入一个条件运算符。
public static string RandomGuidString(int length) => Guid.NewGuid().ToString("N").Substring(0, length < 32 ? length : 32);

1
这似乎是一种相当简短而快速的方法,以扩展方法的形式呈现。
private static readonly Random Random = new();

public static string GenerateRandomString(this string sourceAlphabet, int length)
{
    var chars = new char[length];

    // reuse local 'length' var for iteration
    while (--length >= 0)
        chars[length] = sourceAlphabet[Random.Next(sourceAlphabet.Length)]

    return new string(chars);
}

使用方法:

"ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890".GenerateRandomString(8); // random alpha-nums
"1234567890".GenerateRandomString(5); // random numbers

0
这里有一个生成随机字母数字字符串的机制(我用它来生成密码和测试数据),而不需要定义字母表和数字。
CleanupBase64将删除字符串中的必要部分,并递归地继续添加随机字母数字。
        public static string GenerateRandomString(int length)
        {
            var numArray = new byte[length];
            new RNGCryptoServiceProvider().GetBytes(numArray);
            return CleanUpBase64String(Convert.ToBase64String(numArray), length);
        }

        private static string CleanUpBase64String(string input, int maxLength)
        {
            input = input.Replace("-", "");
            input = input.Replace("=", "");
            input = input.Replace("/", "");
            input = input.Replace("+", "");
            input = input.Replace(" ", "");
            while (input.Length < maxLength)
                input = input + GenerateRandomString(maxLength);
            return input.Length <= maxLength ?
                input.ToUpper() : //In my case I want capital letters
                input.ToUpper().Substring(0, maxLength);
        }

你已经声明了 GenerateRandomString 并从 SanitiseBase64String 中调用了 GetRandomString。同时,你也声明了 SanitiseBase64String 并在 GenerateRandomString 中调用了 CleanUpBase64String - Wai Ha Lee

0
public static class StringHelper
{
    private static readonly Random random = new Random();

    private const int randomSymbolsDefaultCount = 8;
    private const string availableChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

    private static int randomSymbolsIndex = 0;

    public static string GetRandomSymbols()
    {
        return GetRandomSymbols(randomSymbolsDefaultCount);
    }

    public static string GetRandomSymbols(int count)
    {
        var index = randomSymbolsIndex;
        var result = new string(
            Enumerable.Repeat(availableChars, count)
                      .Select(s => {
                          index += random.Next(s.Length);
                          if (index >= s.Length)
                              index -= s.Length;
                          return s[index];
                      })
                      .ToArray());
        randomSymbolsIndex = index;
        return result;
    }
}

2
  1. 静态方法应该是线程安全的。
  2. 将索引递增而不是直接使用 random.Next 的结果有什么意义?这只会使代码变得复杂,而且没有任何实际作用。
- CodesInChaos

0

有一个很棒的NuGet包可以让这变得非常简单。

var myObject = new Faker<MyObject>()
.RuleFor(p => p.MyAlphaNumericProperty, f => f.Random.AlphaNumeric(/*lenght*/ 7))
.Generate();

一个很好的例子是这里


-1
非常简单的解决方案。它使用ASCII值,只是在它们之间生成“随机”的字符。
public static class UsernameTools
{
    public static string GenerateRandomUsername(int length = 10)
    {
        Random random = new Random();
        StringBuilder sbuilder = new StringBuilder();
        for (int x = 0; x < length; ++x)
        {
            sbuilder.Append((char)random.Next(33, 126));
        }
        return sbuilder.ToString();
    }

}

-1

我不能百分之百确定,因为我没有测试这里的每个选项,但是在我测试过的选项中,这个是最快的。我用秒表计时,显示了9-10个滴答声,所以如果速度比安全性更重要,请尝试这个:

 private static Random random = new Random(); 
 public static string Random(int length)
     {   
          var stringChars = new char[length];

          for (int i = 0; i < length; i++)
              {
                  stringChars[i] = (char)random.Next(0x30, 0x7a);                  
                  return new string(stringChars);
              }
     }

为什么要回复?这个问题已经被回答了很多次,但你仍然发布了你的半成品答案。 - Laurent

-3
你只需要使用汇编SRVTextToImage,并编写以下代码来生成随机字符串。
CaptchaRandomImage c1 = new CaptchaRandomImage();
            string text = c1.GetRandomString(8);

大多数情况下,它用于实现验证码。但在您的情况下,它也可以工作。希望能有所帮助。


那么你的意思是我们应该使用一些最初设计用于生成CAPTCHA的第三方库来生成随机字符串? - Tsahi Asher
4
这个建议不仅仅在字符串方面是随机的!我喜欢它,绝对是最有创意的! - BanksySan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接