在C#中随机生成的十六进制数

时间:2009-06-28 02:29:05

标签: c# random hex

如何使用C#生成具有我选择长度的随机十六进制数?

8 个答案:

答案 0 :(得分:41)

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");
}

答案 1 :(得分:16)

    Random random = new Random();
    int num = random.Next();
    string hexString = num.ToString("X");

random.Next()接受允许您指定最小值和最大值的参数,这样就可以控制长度。

答案 2 :(得分:4)

取决于你想要的随机性,但这里有3种选择: 1)我通常只使用Guid.NewGuid并选择它的一部分(dep。我想要多大的数字)。

2)如果你只是想要'随机',System.Random(见其他回复)是好的。

3)System.Security.Cryptography.RNGCryptoServiceProvider

答案 3 :(得分:2)

这是一个会返回256位十六进制字符串的字符串(8x8 = 256):

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;
}

答案 4 :(得分:1)

....使用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")));
}

答案 5 :(得分:0)

如果您希望它是加密安全的,您应该使用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")));
}

答案 6 :(得分:0)

创建一个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()设为静态来随意扩展示例。

答案 7 :(得分:0)

我需要类似于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