108 votes

Génération de chaîne aléatoire unique

Je voudrais générer des chaînes uniques aléatoires comme celles générées par la bibliothèque MSDN:

http://msdn.microsoft.com/en-us/library/t9zk6eay.aspx , par exemple. Une chaîne telle que 't9zk6eay' devrait être générée.

186voto

Michael Kropat Points 3993

Comme personne n’a encore fourni de code sécurisé, j’envoie ce qui suit au cas où quelqu'un le jugerait utile.

 string RandomString(int length, string allowedChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") {
    if (length < 0) throw new ArgumentOutOfRangeException("length", "length cannot be less than zero.");
    if (string.IsNullOrEmpty(allowedChars)) throw new ArgumentException("allowedChars may not be empty.");

    const int byteSize = 0x100;
    var allowedCharSet = new HashSet<char>(allowedChars).ToArray();
    if (byteSize < allowedCharSet.Length) throw new ArgumentException(String.Format("allowedChars may contain no more than {0} characters.", byteSize));

    // Guid.NewGuid and System.Random are not particularly random. By using a
    // cryptographically-secure random number generator, the caller is always
    // protected, regardless of use.
    using (var rng = new System.Security.Cryptography.RNGCryptoServiceProvider()) {
        var result = new StringBuilder();
        var buf = new byte[128];
        while (result.Length < length) {
            rng.GetBytes(buf);
            for (var i = 0; i < buf.Length && result.Length < length; ++i) {
                // Divide the byte into allowedCharSet-sized groups. If the
                // random value falls into the last group and the last group is
                // too small to choose from the entire allowedCharSet, ignore
                // the value in order to avoid biasing the result.
                var outOfRangeStart = byteSize - (byteSize % allowedCharSet.Length);
                if (outOfRangeStart <= buf[i]) continue;
                result.Append(allowedCharSet[buf[i] % allowedCharSet.Length]);
            }
        }
        return result.ToString();
    }
}
 

96voto

Mark Synowiec Points 3069

Utiliser Guid serait un très bon moyen, mais pour obtenir un résultat ressemblant à votre exemple, vous souhaiterez probablement le convertir en chaîne Base64:

     Guid g = Guid.NewGuid();
    string GuidString = Convert.ToBase64String(g.ToByteArray());
    GuidString = GuidString.Replace("=","");
    GuidString = GuidString.Replace("+","");
 

Je me débarrasse de "=" et "+" pour me rapprocher un peu de votre exemple, sinon vous obtenez "==" à la fin de votre chaîne et un "+" au milieu. Voici un exemple de chaîne de sortie:

"OZVV5TpP4U6wJthaCORZEQ"

40voto

Keltex Points 17151

Je mets en garde que les Guid sont pas des nombres aléatoires. Ils ne doivent pas être utilisés comme base pour générer quelque chose que vous vous attendez à être totalement aléatoire (voir http://en.wikipedia.org/wiki/Globally_Unique_Identifier):

La cryptanalyse de la WinAPI générateur de GUID montre que, depuis la séquence de V4 Guid est de la pseudo-aléatoire, compte tenu de l'état initial, on peut prédire jusqu'à la prochaine 250 000 Guid retourné par la fonction UuidCreate. C'est pourquoi Guid ne doit pas être utilisé en cryptographie, l'e. g., comme des clés aléatoires.

Au lieu de cela, il suffit d'utiliser le C# Aléatoire de la méthode. Quelque chose comme ceci (code trouvé ici):

private string RandomString(int size)
{
  StringBuilder builder = new StringBuilder();
  Random random = new Random();
  char ch ;
  for(int i=0; i<size; i++)
  {
    ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65))) ;
    builder.Append(ch);
  }
  return builder.ToString();
}

Les guid sont très bien si vous voulez quelque chose d' unique (comme un nom de fichier unique ou de clé dans une base de données), mais ils ne sont pas bons pour quelque chose que vous voulez être aléatoire (comme un mot de passe ou une clé de chiffrement). Donc, cela dépend de votre application.

Edit. Microsoft dit que le Hasard n'est pas la grande forme non plus (http://msdn.microsoft.com/en-us/library/system.random(SV.71).aspx):

Pour générer un point de vue cryptographique sécurisé de nombre aléatoire adapté pour la création d'un mot de passe aléatoire, par exemple, utiliser une classe dérivée à partir du Système.De sécurité.La cryptographie.RandomNumberGenerator un tel Système.De sécurité.La cryptographie.RNGCryptoServiceProvider.

14voto

Lucero Points 38928

Je ne pense pas qu’ils soient vraiment aléatoires, mais j’imagine qu’il s’agit de hachages.

Chaque fois que j'ai besoin d'un identifiant aléatoire, j'utilise généralement un GUID et le convertis en sa représentation "nue":

 Guid.NewGuid().ToString("n");
 

-1voto

Fabian Vilers Points 1679
  • pas sûr que les liens de Microsoft soient générés aléatoirement
  • jetez un coup d'œil à la nouvelle Guid (). ToString ()

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X