我该如何使用C#生成指定长度的随机十六进制数?
static Random random = new Random();
public static string GetRandomHexNumber(int digits)
{
byte[] buffer = new byte[digits / 2];
random.NextBytes(buffer);
string result = String.Concat(buffer.Select(x => x.ToString("X2")).ToArray());
if (digits % 2 == 0)
return result;
return result + random.Next(16).ToString("X");
}
Random random = new Random();
int num = random.Next();
string hexString = num.ToString("X");
random.Next()
接受参数来指定最小值和最大值,因此这就是你控制长度的方式。
取决于你需要多么随机,但这里有三个选择:
我通常只使用Guid.NewGuid并选择其中的一部分(取决于我需要多大的数字)。
如果你只是想要“足够随机”,System.Random(参见其他答复)是不错的选择。
System.Security.Cryptography.RNGCryptoServiceProvider
我需要类似于Python的secrets.token_hex
函数。
如果您需要安全地获取随机字节,可以使用System.Security.Cryptography
命名空间中的RNGCryptoServiceProvider
,像这样:
using var csprng = new RNGCryptoServiceProvider();
var bytes = new byte[16];
csprng.GetNonZeroBytes(bytes); // or csprng.GetBytes(…)
使用LINQ将字节数组转换为十六进制字符串似乎是最易读的选项:
string.Join("", bytes.Select(b => b.ToString("x2"))); // or "X2" for upper case
7fb70c709a5eed32d37ed5771f09c0fe
使用LINQ
private static readonly Random _RND = new Random();
public static string GenerateHexString(int digits) {
return string.Concat(Enumerable.Range(0, digits).Select(_ => _RND.Next(16).ToString("X")));
}
private static string RandomHexString()
{
// 64 character precision or 256-bits
Random rdm = new Random();
string hexValue = string.Empty;
int num;
for (int i = 0; i < 8; i++)
{
num = rdm.Next(0, int.MaxValue);
hexValue += num.ToString("X8");
}
return hexValue;
}
如果你希望它具有加密安全性,应该使用RNGCryptoServiceProvider。
public static string BuildSecureHexString(int hexCharacters)
{
var byteArray = new byte[(int)Math.Ceiling(hexCharacters / 2.0)];
using (var rng = new RNGCryptoServiceProvider())
{
rng.GetBytes(byteArray);
}
return String.Concat(Array.ConvertAll(byteArray, x => x.ToString("X2")));
}
RandomNumberGenerator.GetHexString(int stringLength, bool lowercase = false);
创建一个长度为n(~n/2字节)的随机十六进制字符串:
var randBytes = new byte[n/2 + n%2>0?1:0];
new Random().NextBytes(randBytes);
var hex = BitConverter.ToString(randBytes).Replace("-", string.Empty).Substring(0,n);
你考虑过Base64字符串吗?根据你的应用程序,它们通常更有用。它们保证是ASCII并且每个输入字节提供约4/3个字符。要创建一个n个字符的字符串:
var randBytes = new byte[(n/4 + n%4>0?1:0)*3];
new Random().NextBytes(randBytes);
var base64 = Convert.ToBase64String(randBytes).Substring(0,n);
显然,如果您的应用程序不需要奇数个十六进制字符或不是4个字符的倍数的Base64,则可以省略.Substring(0,n)。
随意扩展示例,使Random()静态化,正如其他帖子中所建议的那样。
length <= 8
时才能正常工作,因为int.MaxValue
可以用 8 个十六进制数字表示。 - Mehrdad Afshariint num = random.Next(1000, 5000);
- 在这里你可以设置任何范围的数字random.Next(1000, 5000);
,这将生成1000到5000之间的随机数。 - Andrei Krasutski