Случайно сгенерированное шестнадцатеричное число в C # - PullRequest
26 голосов
/ 28 июня 2009

Как я могу сгенерировать случайное шестнадцатеричное число с выбранной длиной, используя C #?

Ответы [ 7 ]

41 голосов
/ 28 июня 2009
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");
}
16 голосов
/ 28 июня 2009
    Random random = new Random();
    int num = random.Next();
    string hexString = num.ToString("X");

random.Next () принимает аргументы, которые позволяют вам указать минимальное и максимальное значения, так что вы будете контролировать длину.

4 голосов
/ 28 июня 2009

Зависит от того, насколько вы случайны, но есть 3 варианта: 1) Я обычно просто использую Guid.NewGuid и выбираю его часть (в зависимости от того, какое количество я хочу).

2) System.Random (см. Другие ответы) хорош, если вы просто хотите «достаточно случайным».

3) System.Security.Cryptography.RNGCryptoServiceProvider

2 голосов
/ 04 ноября 2015

Вот тот, который возвращает 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;
}
1 голос
/ 09 мая 2018

.... с 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")));
}
0 голосов
/ 25 октября 2018

Создайте 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);

Очевидно, что вы можете опустить .Substring (0, n), если ваше приложение не требует либо нечетного числа шестнадцатеричных символов, либо Base64, который не кратен 4 символам.

Не стесняйтесь расширять примеры, делая статическим Random (), как предлагали другие авторы.

0 голосов
/ 22 мая 2018

Если вы хотите, чтобы он был криптографически защищенным, вы должны использовать 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")));
}
...