Les principaux objectifs de mon code:
- La distribution de chaînes de caractères est presque uniforme (ne vous souciez pas des déviations mineures, tant qu'ils sont petits)
- Il ne sort plus que quelques milliards de cordes pour chaque thèse. La génération d'un 8 chaîne de caractères (~47 bits d'entropie) est vide de sens si votre GÉNÉRATEUR génère 2 milliards de dollars (31 bits d'entropie) valeurs différentes.
- C'est sûr, car j'espère que les gens l'utiliser pour les mots de passe ou d'autres jetons de sécurité.
La première propriété est réalisé en prenant en 64 bits valeur modulo l'alphabet de taille. Pour les petits alphabets (comme la 62 caractères à partir de la question) cela conduit à des biais négligeable. La deuxième et la troisième propriété sont obtenus en utilisant RNGCryptoServiceProvider
au lieu de System.Random
.
using System;
using System.Security.Cryptography;
public static string GetRandomAlphanumericString(int length)
{
const string alphanumericCharacters =
"ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
"abcdefghijklmnopqrstuvwxyz" +
"0123456789";
return GetRandomString(length, alphanumericCharacters);
}
public static string GetRandomString(int length, IEnumerable<char> characterSet)
{
if (length < 0)
throw new ArgumentException("length must not be negative", "length");
if (length > int.MaxValue / 8) // 250 million chars ought to be enough for anybody
throw new ArgumentException("length is too big", "length");
if (characterSet == null)
throw new ArgumentNullException("characterSet");
var characterArray = characterSet.Distinct().ToArray();
if (characterArray.Length == 0)
throw new ArgumentException("characterSet must not be empty", "characterSet");
var bytes = new byte[length * 8];
new RNGCryptoServiceProvider().GetBytes(bytes);
var result = new char[length];
for (int i = 0; i < length; i++)
{
ulong value = BitConverter.ToUInt64(bytes, i * 8);
result[i] = characterArray[value % (uint)characterArray.Length];
}
return new string(result);
}
(Ceci est une copie de ma réponse à Comment puis-je générer de l'aléatoire de 8 caractères alphanumériques chaînes de caractères en C#?)