Come posso generare un numero esadecimale casuale con una lunghezza di mia scelta utilizzando C#?Numero esadecimale generato in modo casuale in C#
risposta
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() batte argomenti che consentono di specificare un minimo e un valore massimo, in modo che come si dovrebbe controllare la lunghezza.
Dipende dal modo in cui lo si desidera, ma qui ci sono 3 alternative: 1) Di solito uso Guid.NewGuid e ne seleziono una parte (in base alla quantità che desidero).
2) System.Random (vedere altre risposte) è buono se si desidera solo "abbastanza casuale".
3) System.Security.Cryptography.RNGCryptoServiceProvider
Affettare un GUID sembra un vera cattiva idea per me. Sono unici solo nel loro insieme. Molti bit di un GUID non sono certamente casuali. – spender
@spender è corretto, ad esempio molti GUID contengono l'indirizzo MAC del PC che li genera. –
Eh, no, i guids basati su mac-address sono stati ritirati nel 2000, poiché erano considerati un potenziale problema di sicurezza. I GUID sono ora generati da un generatore di numeri casuali (122 bit casuali, 6 bit non casuali). In entrambi i casi, l'uso di una porzione di bit 32 (o più) di un guid fornisce un numero più casuale di System.Random. Cioè, a meno che non chiami UuidCreateSequential che è stato aggiunto per compatibilità con le versioni precedenti nel caso in cui qualcuno volesse dei vecchi guai stile, ma questa è una storia diversa. – KristoferA
Ecco uno che avrebbe restituire una stringa esadecimale a 256 bit (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;
}
che funzionerà solo se 'lunghezza <= 8' come 'int.MaxValue' corrisponde a 8 cifre esadecimali. –
Se davvero vuole che la stringa esadecimale abbia una lunghezza a sua scelta, è necessario un codice che calcoli il numero minimo con lunghezza esadecimale 'x' e massimo con lunghezza 'x'. – colithium
Sì. L'ho lasciato fuori di proposito, ma basteresti semplicemente fare una conversione su 0xF? ('scusa la mia espressione regolare) per trovare qualunque numero intero corrisponda alla lunghezza desiderata. – womp