Ir para o conteúdo
Silvaz

Criar ID único Delphi

Mensagens Recomendadas

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?

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
dArkStyle

Boa dica Nunopicado  :hmm:

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"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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"

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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;

 

  • Voto 1

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.