0

我需要一种方法来生成精确数量的伪随机(字符串)数据。例如,我想编写一个方法,该方法接受要生成的字节数的参数并返回该精确大小的字符串。

我最初打算简单地为每个需要的字节生成 1 个字符,但显然字符不再都是一个字节了。

任何帮助表示赞赏!

4

4 回答 4

3

我建议使用RNGCryptoServiceProvider它可以生成任意数量的随机字节。然后您可以将其转换为字符串(例如使用 byte64 编码或其他方法)。

记得添加using System.Security.Cryptography;到文件中。

public class RandomService : IDisposable
{
    private readonly RNGCryptoServiceProvider rngCsp;

    public CryptoService()
    {
        rngCsp = new RNGCryptoServiceProvider();            
    }

    public byte[] GetRandomBytes(int length)
    {
        var bytes = new byte[length];
        rngCsp.GetBytes(bytes);
        return bytes;
    }

    public string GetRandomString(int length)
    {
        var numberOfBytesForBase64 = (int) Math.Ceiling((length*3)/4.0);
        string base64String = Convert.ToBase64String(GetRandomBytes(numberOfBytesForBase64)).Substring(0, length); //might be longer because of padding            
        return base64String.Replace('+', '_').Replace('/', '-'); //we don't like these base64 characters
    }

    public void Dispose()
    {
        rngCsp.Dispose();
    }
}
于 2012-09-26T12:08:18.063 回答
2

您可能可以参加Randombyte[]课程,然后转换为ToString()

于 2012-09-26T12:06:31.307 回答
1
char[] UsableChars = { 'a', 'b', 'c', '1', ...., `☺` };
Random r = new Random();

int wantedSize = 12;

string s = new string (Enumerable.Range(0, wantedSize)
    .Select((i) =>  UsableChars[r.Next(UsableChars.Length)]).ToArray());
于 2012-09-26T12:08:15.730 回答
0

如果您使用一组有限的字符,您可以选择那些最终将作为单字节代码的字符,而不管使用何种编码。

public byte[] CreateFiller(int length, Random rnd) {
  string chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
  return Encoding.UTF8.GetBytes(Enumerable.Range(0, length).Select(i => chars[rnd.Next(chars.Length)]).ToArray());
}

// only use the overload that creates a Random object itself if you use it once, not in a loop
public byte[] CreateFiller(int length) {
  return CreateFiller(length, new Random());
}
于 2012-09-26T20:50:23.893 回答