Как я могу сгенерировать случайное шестнадцатеричное число с длиной моего выбора с помощью С#?
Произвольно генерируемое шестнадцатеричное число в С#
Ответ 1
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");
}
Ответ 2
Random random = new Random();
int num = random.Next();
string hexString = num.ToString("X");
random.Next() принимает аргументы, которые позволяют указать значение min и max, чтобы вы могли управлять длиной.
Ответ 3
В зависимости от того, насколько вы производите его, но вот 3 альтернативы: 1) Обычно я просто использую Guid.NewGuid и выбираю часть его (от того, сколько я хочу).
2) System.Random(см. другие ответы) хорошо, если вы просто хотите "достаточно случайный".
3) System.Security.Cryptography.RNGCryptoServiceProvider
Ответ 4
Здесь один, который вернет 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;
}
Ответ 5
.... с 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")));
}
Ответ 6
Если вы хотите, чтобы он был криптографически защищенным, вы должны использовать 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")));
}
Ответ 7
Создайте символ 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() статичным, как предлагали другие авторы.
Ответ 8
Мне нужно что-то похожее на функцию Python secrets.token_hex
.
Если вам нужны случайные байты с криптографической защитой, вы можете использовать RNGCryptoServiceProvider
в пространстве имен System.Security.Cryptography
, например:
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