Jump to content
Silvaz

Criar ID único Delphi

Recommended Posts

Silvaz

Boas,

alguém me sabe explicar como criar um ID único? valor pode ser com o time(now), com o prefixo sc1.

o PHP usa o uniqid mas no delphi acho que tem de ser á unha...

    function get_new_id($prefix = '') {
        // Use the passed in prefix, if it exists
        if (!empty($prefix))
            $this->prefix = $prefix;

        // Only use first 3 letters
        $this->prefix = strlen($this->prefix) > 3 ? substr($this->prefix, 0, 3) : $this->prefix;

        return uniqid($this->prefix);

ID gerado pelo php: sc14dd8da942c8f5

Será que existe algum método tipo com o md5 ou outro qualquer?

Share this post


Link to post
Share on other sites
dArkStyle

Irás guardar o ID numa base dados?


Stephane SoaresCurso Profissional de Gestão e Programação de Sistemas InformáticosACEITAM-SE PROPOSTAS DE TRABALHO "FREELANCER"

Share this post


Link to post
Share on other sites
Silvaz

Sim o objectivo é guardar o ID numa base de dados, para puder ser utilizada mais tarde.

Share this post


Link to post
Share on other sites
dArkStyle

pq nao usas a numeração automatica disponivel no tipo de dados das base dados como chave primaria?


Stephane SoaresCurso Profissional de Gestão e Programação de Sistemas InformáticosACEITAM-SE PROPOSTAS DE TRABALHO "FREELANCER"

Share this post


Link to post
Share on other sites
Silvaz

porque já existem outros valores, com prefixo sc1 e são strings... essa coluna não tem numeração automática, modificar essa coluna implica modificar muita coisa.

o exemplo prático é:

Adicionar novo utilizador á tabela login... tenho de criar um ID para o memberid(não sei que valor usar ou metodo)... uma pass em MD5 o resto é facil.

Share this post


Link to post
Share on other sites
nunopicado

Se tiveres o pacoe JEDI instalado, tens um componente chamado serialmaker, que te gera um codigo unico a partir de uma string.

De outro modo, só criando uma função que pegue em informação do pc (por exemplo, data e hora, nome do posto, etc) ou aleatoria, e com um algoritmo qualquer transformar essa info em codigo hexadecimal (que é o caso desse que mostraste em PHP).

Algo tipo:

function GetNewID(Prefix:String):string;
var
   Al:integer;
   i:integer;
begin
     Result:='';
     randomize;
     for i:=1 to 7 do
         Result:=Result+inttohex(random(255),2);
     Result:=Prefix+Result;
end;

Crias esta função e ao chamares (por exemplo i:=GetNewID('sc'):D o resultado será algo tipo isto: sc1AFBC37F7061E3

Serve?


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
nunopicado

Tens aqui outra que mete a data e hora, para evitar ainda mais as duplicações...

function GetNewID(Prefix:String):string;
var
   reg:array [1..7] of word;
   Ano,Mes,Dia,Hora,Minuto,Segundo,MSeg,i:word;
begin
     Result:='';
     DecodeDate(Date,reg[1],reg[2],reg[3]);
     Ano:=StrToInt(Copy(IntToStr(reg[1]),3,2));
     DecodeTime(Time,reg[4],reg[5],reg[6],reg[7]);
     randomize;
     for i:=1 to 7 do
         begin
              reg[i]:=reg[i]+Random(100);
              Result:=Result+IntToHex(reg[i],2);
         end;
     Result:=Prefix+Result;
end;


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
dArkStyle

Boa dica Nunopicado  🤔

Penso que se ele usar a segunda opção sera melhor pois a data e a hora tornará automaticamente a tal chave sempre diferente  :D


Stephane SoaresCurso Profissional de Gestão e Programação de Sistemas InformáticosACEITAM-SE PROPOSTAS DE TRABALHO "FREELANCER"

Share this post


Link to post
Share on other sites
Silvaz

Nunopicado vou optar pela 2ª opção, mas sem o random pois com ele as hipóteses de ter 1 ID igual são muito poucas mas existem...acho eu.

O campo na base de dados é Char(16) e o resultado tem 18 'sc17db06020f083500'

Ao inserir na base de dados ele corta para 16 assim pode haver possibilidades de ID iguais.

Se eu quiser ter 16 dígitos a contar com o sc tipo(sc14ddb7e9549d5e) como faço?

desde já muito obrigado  :D

Share this post


Link to post
Share on other sites
dArkStyle

nunca ira dar igual mesmo com o random.

Se pensares nunca ha um data e hora igual

é sempre algo diferente... nem k seja apenas os milesimos de segundo sao diferentes :thumbsup:


Stephane SoaresCurso Profissional de Gestão e Programação de Sistemas InformáticosACEITAM-SE PROPOSTAS DE TRABALHO "FREELANCER"

Share this post


Link to post
Share on other sites
nunopicado

Desculpa lá a cena dos bits a mais... :thumbsup: Foi a pressa para ir para o trabalho e não testei!

O que estava a acontecer é que o ano e os milisegundos têm (ou podem ter) mais do que o valor 255, o que origina um numero hexadecimal de mais do que 1 byte.

Eu tinha corrigido o ano (os milisegundos nem me lembrei) mas como depois alterei para um array para facilitar o calculo final, esqueci-me de alterar a variavel... Fica assim então:

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;

Assim já dá? :D


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
nunopicado

Sempre às ordens...  :thumbsup:


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites
Jonathan Fabrício Seibel

Boa dica "nunopicado", 

Também é possível usando o gerador próprio de ID do delphi da seguinte forma

function idUnique:String;
var
  gID: TGuid;
begin
  CreateGUID(gID);
  result := gID.ToString;
end;

 

  • Vote 1

Share this post


Link to post
Share on other sites
nunopicado

Eish o que tu foste desenterrar, moço! :D
Não me lembrava nada disto.

Sim, é uma opção válida também! :)


"A humanidade está a perder os seus génios... Aristóteles morreu, Newton já lá está, Einstein finou-se, e eu hoje não me estou a sentir bem!"

> Não esclareço dúvidas por PM: Indica a tua dúvida no quadro correcto do forum.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.