Pergunta

Como posso gerar um número hexadecimal aleatório com um comprimento da minha escolha usando C#?

Foi útil?

Solução

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

Outras dicas

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

Random.Next () leva argumentos que permitem especificar um min e um valor máximo, e é assim que você controlaria o comprimento.

Depende de quão aleatório você deseja, mas aqui estão 3 alternativas: 1) Normalmente, eu apenas uso o GUID.NewGuid e escolho uma parte dele (dep. Do tamanho do número que eu quero).

2) System.Random (veja outras respostas) é bom se você quiser apenas 'aleatório o suficiente'.

3) System.Security.Cryptography.RngCryptoServiceProvider

Aqui está um que retornaria uma string hexadecimal de 256 bits (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;
}

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

Se você deseja que seja um criptograficamente seguro, você deve usar o 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")));
}

Crie um personagem N (~ n/2 byte), sequência aleatória de hexadecimal:

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

Você já considerou as cordas base64? Dependendo do seu aplicativo, eles geralmente podem ser mais úteis. Eles são garantidos como ASCII e fornecem ~ 4/3 caracteres por byte de entrada. Para criar uma string de caracteres:

var randBytes = new byte[(n/4 + n%4>0?1:0)*3];
new Random().NextBytes(randBytes);
var base64 = Convert.ToBase64String(randBytes).Substring(0,n);

Obviamente, você pode omitir o .substring (0, n) se o seu aplicativo não exigir um número ímpar de caracteres hexadecimal ou um base64 que não é um múltiplo de 4 caracteres.

Sinta -se à vontade para estender os exemplos, tornando -se estático aleatório (), como outros pôsteres sugeriram.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top