Pergunta

Eu gostaria de criar nomes de pastas aleatórias no meu site para armazenar imagens e suas miniaturas, mas em vez de usar a versão completa de um guid gerada, eu estava pensando em usar apenas parte dela, talvez apenas os primeiros 8 caracteres e possivelmente base64 codificá-lo. Estou preocupado com possíveis colisões embora.

Pode alguém me aponte na direção certa quanto a saber se é ou não é uma idéia boa o suficiente? existem soluções alternativas que podem ser usadas se eu quiser manter o nome sob um determinado número de caracteres?

Atualizar : Eu estou tentando ficar longe de path.GetRandomFileName, uma vez que utiliza guid cru e não é de 12 caracteres longo ...

Foi útil?

Solução

Por que não usar algo como isto, e loop de volta até que você pode criar o arquivo sem conflito?

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

A razão para passando o RNG é evitar os problemas típicos da criação de um novo RNG no método (duplicatas quando chamado em rápida sucessão), enquanto não usando um RNG estática (que não é threadsafe).

Uma alternativa seria ter um único estático readonly RNG, e chamadas serialize dentro GenerateName travando.

O ponto principal é que de alguma forma você gera um nome aleatório, e você continua tentando criar arquivos com nomes aleatórios até você ter sucesso, o que é provável que aconteça muito rapidamente (12 caracteres [AZ 0 -9] dá 4,738,381,338,321,616,896 combinações possíveis).

Outras dicas

System.IO.Path.GetRandomFileName ()

Você pode usar a classe Path em System.IO para, entre outras coisas, gerar nomes de arquivos e pastas aleatórias.

Se você estiver usando um banco de dados para o seu web site, então você pode usar um número de incremento automático ou uma seqüência para gerar nomes de arquivos exclusivos para as imagens.

Usando o Oracle você criaria uma sequência como segue;

CREATE SEQUENCE sequence_name valor MINVALUE valor MAXVALUE valor START WITH Aumentar o valor em valor CACHE;

Para obter o próximo valor na seqüência você usar o nextval da seqüência. Por exemplo

CREATE SEQUENCE seq_user_id;

SELECIONAR seq_user_id.NEXTVAL DE dual;

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top