2009-05-01 5 views
4

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

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

UPDATE: Я пытаюсь держаться подальше от path.GetRandomFileName, так как он использует сырые и GUID не длиной 12 символов ...

ответ

13

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

const string ValidChars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 

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, чтобы избежать типичных проблем создания нового RNG в методе (дубликаты при вызове в быстрой последовательности), а не с помощью статического RNG (который не потокобезопасен).

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

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

+1

+1 для проблем с RNG –

+1

+1 с использованием этой модификации для создания кодов купонов для витрины. Я бы использовал один RNG - но блокировка действительно необходима? класс Random не является потокобезопасным? – TheSoftwareJedi

+1

Нет, Random не является потокобезопасным. Я, кажется, помню, что если вы используете его из нескольких потоков, вы можете оказаться в странной ситуации с семенем 0, которое повторяется навсегда :( –

3

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

9

System.IO.Path.GetRandomFileName()

+0

Функция создает имена папок с помощью guid, чего я пытаюсь избежать. Как я могу получить папку с именем, например, «dGhlIG1pbmQs»? – ak3nat0n

+0

нет, он возвращает имя 8.3. 8 символов, период, 3 символа, все буквенно-цифровые. – bsneeze

1

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

Используя Oracle, вы должны создать последовательность следующим образом;

CREATE SEQUENCE sequence_name значение MINVALUE значение MaxValue START со значением увеличивается на значение значение CACHE;

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

CREATE SEQUENCE seq_user_id;

SELECT seq_user_id.NEXTVAL FROM dual;

INSERT INTO test_bed (user_id, class_type, room_location) ЗНАЧЕНИЯ (seq_user_id.NEXTVAL, «Подводная корзина», «RM1205»);

+0

как бы вы создали эту последовательность? – ak3nat0n