Question

J'aimerais créer des noms de dossier aléatoires sur mon site Web pour stocker des images et leurs vignettes, mais au lieu d'utiliser la version complète d'un guide généré, je pensais n'en utiliser qu'une partie, peut-être uniquement les 8 premiers caractères. éventuellement base64 l'encoder. Je m'inquiète cependant de possibles collisions.

Quelqu'un peut-il m'indiquer dans la bonne direction si c'est une idée suffisamment bonne? existe-t-il des solutions alternatives qui peuvent être utilisées si je veux conserver le nom sous un certain nombre de caractères?

UPDATE : j'essaie de rester à l'écart de path.GetRandomFileName, car il utilise un GUID brut et ne dépasse pas 12 caractères ...

Était-ce utile?

La solution

Pourquoi ne pas simplement utiliser quelque chose comme ceci et faire le tour jusqu'à ce que vous puissiez créer le fichier sans conflit?

 const string ValidChars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";

 static string GenerateName(Random random, int length)
 {
     char[] chars = new char[length];
     for (int i=0; i < length; i++)
     {
         chars[i] = ValidChars[random.Next(ValidChars.Length)];
     }
     return new string(chars);
 }

La raison de passer le RNG est d'éviter les problèmes typiques de la création d'un nouveau RNG dans la méthode (dupliqués lorsqu'il est appelé en succession rapide) sans utiliser un RNG statique (qui n'est pas thread-safe).

Une autre solution consisterait à créer un seul groupe statique de disponibilité statique en lecture seule et à sérialiser les appels dans GenerateName en les verrouillant.

Le point essentiel est que en quelque sorte, vous générez un nom aléatoire et vous continuez à essayer de créer des fichiers avec des noms aléatoires jusqu'à votre réussite, ce qui risque de se produire très rapidement (12 caractères [AZ 0 -9] donne 4,738,381,338,321,616,896 combinaisons possibles).

Autres conseils

System.IO.Path.GetRandomFileName ()

Vous pouvez utiliser la classe Path dans System.IO pour générer, entre autres, des noms de fichiers et de dossiers aléatoires.

Si vous utilisez une base de données pour votre site Web, vous pouvez utiliser un nombre ou une séquence auto-incrémenté pour générer des noms de fichier uniques pour les images.

En utilisant Oracle, vous créez une séquence comme suit;

CREATE SEQUENCE nom-séquence     Valeur MINVALUE     Valeur MAXVALUE     COMMENCER AVEC valeur     INCREMENT BY valeur     Valeur CACHE;

Pour obtenir la valeur suivante de la séquence, utilisez le nextval de la séquence. Par exemple

CREATE SEQUENCE seq_user_id;

SELECT seq_user_id.NEXTVAL FROM dual;

INSERT INTO test_bed (user_id, class_type, room_location) VALUES (seq_user_id.NEXTVAL, 'Basketweaving sous-marin', 'RM1205');

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top