как создать случайные имена папок длиной 12 символов в .NET

Я хотел бы создать случайные имена папок на своем веб-сайте для хранения изображений и их эскизов, но вместо использования полной версии сгенерированного guid я думал об использовании только его части, возможно, только первых 8 символов и, возможно, кодирования base64 Это. Однако я беспокоюсь о возможных столкновениях.

Может ли кто-нибудь указать мне правильное направление относительно того, достаточно ли это хорошая идея? Есть ли альтернативные решения, которые можно использовать, если я хочу, чтобы имя содержало определенное количество символов?

ОБНОВЛЕНИЕ: я пытаюсь держаться подальше от path.GetRandomFileName, так как он использует необработанный идентификатор и не содержит 12 символов ...


person ak3nat0n    schedule 01.05.2009    source источник


Ответы (4)


Почему бы просто не использовать что-то подобное и повторить цикл до тех пор, пока не удастся создать файл без конфликтов?

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

Причина передачи ГСЧ состоит в том, чтобы избежать типичных проблем создания нового ГСЧ в методе (дублируется при быстром вызове) без использования статического ГСЧ (который не является потокобезопасным).

Альтернативой может быть один статический RNG, доступный только для чтения, и сериализация вызовов в GenerateName путем блокировки.

Суть в том, что каким-то образом вы генерируете случайное имя и просто продолжаете пытаться создавать файлы со случайными именами, пока не добьетесь успеха, что, скорее всего, произойдет очень быстро (12 символов [AZ 0-9] дает 4,738,381,338,321,616,896 возможных комбинаций).

person Jon Skeet    schedule 01.05.2009
comment
+1, используя модификацию этого для генерации кодов купонов для витрины. Я бы использовал один ГСЧ, но действительно ли необходима блокировка? Класс Random не является потокобезопасным? - person TheSoftwareJedi; 17.06.2009
comment
Нет, Random не является потокобезопасным. Кажется, я помню, что если вы используете его из нескольких потоков, вы можете оказаться в странной ситуации с начальным значением 0, которое повторяется бесконечно :( - person Jon Skeet; 17.06.2009
comment
В документации говорится, что это не гарантирует потокобезопасность, и если вы посмотрите на реализацию с Reflector, вы увидите, что у нее нет никакой блокировки, а InternalSample () может легко иметь проблемы, если там одновременно было несколько потоков ... - person AakashM; 17.06.2009

System.IO.Path.GetRandomFileName ()

person bsneeze    schedule 01.05.2009
comment
функция создает имена папок с помощью guid, чего я пытаюсь избежать. Как, например, получить папку с именем dGhlIG1pbmQs? - person ak3nat0n; 01.05.2009
comment
нет, он возвращает имя 8.3. 8 символов, точка, 3 символа, все буквенно-цифровые. - person bsneeze; 02.05.2009

Вы можете использовать класс Path в System.IO, среди прочего, для генерации случайных имен файлов и папок.

person GWLlosa    schedule 01.05.2009

Если вы используете базу данных для своего веб-сайта, вы можете использовать автоматически увеличивающееся число или последовательность для создания уникальных имен файлов для изображений.

Используя Oracle, вы должны создать следующую последовательность:

CREATE SEQUENCE имя_последовательности MINVALUE значение MAXVALUE value НАЧАТЬ СО значения УВЕЛИЧЕНИЕ НА значение CACHE value;

Чтобы получить следующее значение в последовательности, вы используете следующее значение последовательности. Например

СОЗДАТЬ ПОСЛЕДОВАТЕЛЬНОСТЬ seq_user_id;

ВЫБЕРИТЕ seq_user_id.NEXTVAL ИЗ двойного;

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

person Dennis Ecclestone    schedule 01.05.2009
comment
как бы вы сгенерировали эту последовательность? - person ak3nat0n; 01.05.2009