Como obter um nome único de arquivo gerado automaticamente

Iniciado por adalberto, Julho 01, 2017, 01:34:49 PM

tópico anterior - próximo tópico

adalberto

A código abaixo é um exemplo de como gerar um nome aleatório baseado na data:

Segue o código:



local cont = 0;
local str_formate = string.formate;
local sis_data = sis.data;

local funcao obt_nome(prefix)
  local prefix = prefix ou 'tmp';
  cont = cont + 1;
  se cont >= 2555 entao cont = 0; fim //permite que nomes criados ao mesmo tempo tenham uma variação de 0 a 255 em hex
  local d = sis_data('%S%M%H%Y%m%d');
  retorne str_formate('%s%x%x',prefix,d, cont);
fim

para i=1,10 inicio
  poe(obt_nome());
fim
poe'-------------------------'
poe(obt_nome('pref') );
poe'-------------------------'
imprima(sis.nometmp());



Testei este código em um loop com 1000000 de repetições e não houve valores iguais, em teoria não haverá nomes iguais mesmo que o programa fique rodando mais de 1000 anos, pois a chave criada baseia-se no ano, dia, mes, hora, minuto, segundo e um contador para evitar que surja resultados iguais em um milésimo de segundo.

Para evitar que dois programas criem a mesma chave se executados ao mesmo tempo, use o parâmetro prefixo.

Se preferir, pode salvar o código acima em uma biblioteca (salve como uid.pris [unico id], por exemplo), veja:


local cont = 0;
local str_formate = string.formate;
local sis_data = sis.data;

local funcao obt_nome(prefix)
  local prefix = prefix ou 'tmp';
  cont = cont + 1;
  se cont >= 2555 entao cont = 0; fim //permite que nomes criados ao mesmo tempo tenham uma variação de 0 a 255 em hex
  local d = sis_data('%S%M%H%Y%m%d');
  retorne str_formate('%s%x%x',prefix,d, cont);
fim

retorne {obt_nome = obt_nome };



use:


local uid = inclua'uid';

imprima(uid.obt_nome() );






Lembrando que já existe uma função na lib sis para criar um nome temporário (sis.tmpnome).

Falou, até mais.