O que é uma boa maneira de gerar nomes de arquivo / pasta curtos e únicos?
Pergunta
Os critérios é basicamente isso:
- pastas existirá por cerca 24-48hrs
- pastas nomes não podem ser facilmente guessable por um usuário (se for usado em uma URL)
- nomes de pasta deve ser curto 5-15 caracteres
pensamentos iniciais:
printf('%u',crc32(microtime(true)));
Detalhes: Ao fazer upload de um arquivo, eu basicamente quer manter o nome do arquivo original como nomeado pelo carregador, de modo a evitar qualquer colisão de nomes que eu gostaria de colocá-lo em um diretório exclusivamente nomeado ...
Solução
[Edit] Espere um segundo. PHP inclui direito na biblioteca padrão de um Unique ID função de gerador . Há outras abordagens também.
Outras dicas
A técnica clássica é algo como
+ uploader-name
+ 20090401
+ 010000 // hhmmss
+ 013000 // hhmmss
+ 014500 // hhmmss
...
+ 20090402
acrescentando níveis, acrescentando "a", "b", "c", ... etc. baseado em granularidade desejada.
Isso funciona esp. bem se o usuário se relaciona com os arquivos em tudo cronologicamente.
Você acaba fazendo algumas enumerações existência, mas não é tão doloroso. Eu usei isso muitas vezes (incluindo com PHP), principalmente porque a resistência do usuário é menor do que para qualquer alternativa que eu encontrei.
Se você é tão inclinado que você pode embelezar as expressões de data -. "2009-Abr-01", "01:45 AM", etc
A língua não foi especificado, em Ruby eu faria:
require 'digest/md5'
Digest::MD5.hexdigest(Time.now.to_s)
=> "f531384b3cc8c60b7c5b7ad087cb0ae4"
Isso soa como uma "segurança por obscuridade" problema. Eu recomendaria contra qualquer coisa que cria dados potencialmente sensíveis e expõe-lo (mesmo que por um curto período de tempo) de uma forma que é segura só porque há uma expectativa de que ninguém vai adivinhar a localização. existem bruta ataques de força, e eles podem rasgar este tipo de "segurança".
Use a data e hora, a fim de gerar o nome
Eu usaria algo como:
$salt='Whatever you want';
$folderName=SHA1($salt.date('U'));
Date ( 'U') retorna os segundos desde o Unix Epoch (01 de janeiro de 1970 00:00:00 GMT) para que ele provavelmente vai ser único, a menos que você está gerando várias pastas ao mesmo tempo?
Nesse caso, apenas sutilmente alterar o valor $ sal (torná-lo um nome de usuário ou número aleatório etc).
Baseando o hash (ou md5 ou sha) no tempo torna guessable se o usuário sabe mais ou menos quando o diretório é gerado. Tudo que eles precisam fazer é configurar um script simples para gerar todas as possibilidades cobertas um ou outro lado alguns segundos e depois bateu o site à procura de uma resposta. Adição de um sal, enquanto ele vai ajudar, não faz muito bom no longo prazo.
Para o OP, o acima significa verdade para qualquer método. Se a execução de um servidor muito rápido, você vai precisar para monitorar os hits contra diretórios aleatórios. Só tem 5 letras diretórios significa que alguém poderia bater manualmente o site vezes o suficiente para descobrir o diretório. 15 faz aumentá-lo um pouco, mas com algumas máquinas fazendo isso de uma maneira script, ele não está fora de possibilidade.
C ++ padrão tem funções tmpfile e tmpnum, tanto no cstdio (stdio.h), e cria um ficheiro temporário e nome de ficheiro temporário em conformidade. tmpfile é excluído no final do programa embora. Eu ligá-los, mas infelizmente eu não posso postar links ainda.