Função para gerar um ID único em String
Muitas vezes é necessário criar algum indexificador único
em nossas aplicações.
Para resolver de modo fácil este problema, é possível
fazer uso da função abaixo:
Obs: É necessário estas declarado System.SysUtils na seção uses.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| function GetNewID(Prefix: String): string;
var
reg: array [1 .. 7] of word;
i: integer;
begin
{ EDIT: Vou por mais estas linhas abaixo, para que o prefixo nunca
tenha mais de 2 caracteres, e assim fique fixo o tamanho 16 bytes }
if length(Prefix) > 2 then
Prefix := Copy(Prefix, 1, 2)
else
while length(Prefix) < 2 do
Prefix := ' ' + Prefix;
Result := '';
DecodeDate(Date, reg[1], reg[2], reg[3]);
reg[1] := StrToInt(Copy(IntToStr(reg[1]), 3, 2));
{ Esta corrige o ano para apenas dois digitos, por forma a ser inferior a
255. em vez de reg[1] estava a variavel ano. }
DecodeTime(Time, reg[4], reg[5], reg[6], reg[7]);
reg[7] := reg[7] div 4; // esta corrige os milisegundos
randomize;
for i := 1 to 7 do
begin
if (i >= 2) and (i <= 6) then
reg[i] := reg[i] + random(100);
{ O random é uma segurança adicional, pois como o ano e os milisegundos não
são usados na totalidade, havia uma pequena possibilidade de sair
duplicado... Assim é quase impossivel }
Result := Result + IntToHex(reg[i], 2);
end;
Result := Prefix + Result;
end; |
function GetNewID(Prefix: String): string;
var
reg: array [1 .. 7] of word;
i: integer;
begin
{ EDIT: Vou por mais estas linhas abaixo, para que o prefixo nunca
tenha mais de 2 caracteres, e assim fique fixo o tamanho 16 bytes }
if length(Prefix) > 2 then
Prefix := Copy(Prefix, 1, 2)
else
while length(Prefix) < 2 do
Prefix := ' ' + Prefix;
Result := '';
DecodeDate(Date, reg[1], reg[2], reg[3]);
reg[1] := StrToInt(Copy(IntToStr(reg[1]), 3, 2));
{ Esta corrige o ano para apenas dois digitos, por forma a ser inferior a
255. em vez de reg[1] estava a variavel ano. }
DecodeTime(Time, reg[4], reg[5], reg[6], reg[7]);
reg[7] := reg[7] div 4; // esta corrige os milisegundos
randomize;
for i := 1 to 7 do
begin
if (i >= 2) and (i <= 6) then
reg[i] := reg[i] + random(100);
{ O random é uma segurança adicional, pois como o ano e os milisegundos não
são usados na totalidade, havia uma pequena possibilidade de sair
duplicado... Assim é quase impossivel }
Result := Result + IntToHex(reg[i], 2);
end;
Result := Prefix + Result;
end;
Veja um exemplo de uso:
1
2
3
4
| procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage( GetNewID('SD') );
end; |
procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage( GetNewID('SD') );
end;
no meu caso funcionou perfeitamente e acredito que o código seja compatível
com qualquer versão do Delphi ou Lazarus.
Referência: https://www.portugal-a-programar.pt/forums/topic/44358-criar-id-%C3%BAnico-delphi/
Caso tenha alguma dúvida ou sugestão deixe seu comentário.
-
Giovani Da Cruz
-
4.931 views
- 2 comentários
- 7 de abril de 2018
Está gostando do conteúdo? Considere pagar um cafezinho para nossa equipe!
Posts Relacionados - Continue Aprendendo
eu utilizo dessa forma, acho que também serve
uses
System.DateUtils,…
function GenerateUniqueName(const pPrefix: string = ”): string;
var
LMilsSince: Int64;
begin
if pPrefix.Trim.IsEmpty then
Result := ‘xyz’
else
Result := pPrefix.Trim;
Sleep(1);
LMilsSince := MilliSecondsBetween(DateDelta, Now);
Result := Result + LMilsSince.ToString;
end;
Obrigado Ivan, vamos criar outra dica com sua sugestão.