GARANTIR DESCONTO

Fórum Gerar um número único #274856

31/03/2005

0

Gostaria de saber que função do delphi eu posso usar, ou o que eu posso fazer, para gerar um número único que seja virtualmente impossível de se repetir com o tempo. Pode ser randômico ou não, mas não pode ficar gravado em nenhum arquivo, nem no meu banco de dados. Esse número srá usado como chave primária de algumas tabelas, mas não necessariamente deverá ser seqüencial, o número atual pode ou não depender do anterior.

Sugestões?

Grato!


Vitor Rubio

Vitor Rubio

Responder

Posts

31/03/2005

Motta

Monte um número com a data/hora/min/mlseg (se em rede use a hora do servidor)

20050331131141375

meio bizarro, mais difícil repetir


Responder

Gostei + 0

31/03/2005

Vitor Rubio

Será que usando todo dia no mesmo horario não repete? outra: como posso, da minha aplicação no cliente, pegar a data do servidor? estou usando interbase.


Responder

Gostei + 0

31/03/2005

Motta

1) Não pq. tem a data tb, assim não repete.

2) No Oracle tem uma function Sysdate que retorna a data/hora (até seg), creio que no IB tenha algo assim , mas creio que pode ser a data da máquina local.

3) Ib tem um objeto chamado generator (creio) que gera uma sequencia sem repetição


Responder

Gostei + 0

31/03/2005

Vitor Rubio

não quero usar os generators do interbase, nem as triggers, nem stored procedures. Queria poder pegar a data do sistema do micro onde o interbase está instalado. tem como fazer isso? Valew!


Responder

Gostei + 0

31/03/2005

Motta

Não um número mas uma string alpha (26 letras + 10 digito)

gere um valor ramdomico

para um tamanho de 8 - 2821109907456
10 - 3656158440062976
16 - 7958661109946400884391936

a chance de colisão é mínima (ao não ser que seja para cadastrar cpf de chineses ...)

sendo case sensitive (26+26+10)

16 - 47672401706823533450263330816


Responder

Gostei + 0

31/03/2005

Vitor Rubio

Gostei mais da sua primeira ideia, de concatenar a data do sistema com a hora minuto segundo e milisegundo. posso até pegar o milissegundo do dia. o milissegundo eu posso pegar na maquina local, mas como pegar a data do sistema onde o ib está instalado? senão eu pego local mesmo.

mesmo assim achei interessante a sua outra ideia.

Não entendi esses números que vc colocou: são exemplos dos números gerados e a quantidade de dígitos ou é a quantidade de possibilidades que dá pra fazer com as 26 letras e 10 dígitos? como se implementaria essa função?


Responder

Gostei + 0

31/03/2005

Motta

combinações ,

exemplo para gera números :

procedure TForm1.SpeedButton1Click(Sender: TObject);
var 
  i,j,max:integer;
  s,str:string;
begin
  Randomize;
  if CheckListBox1.Checked[0] then
    str:= ´1234567890´;
  if CheckListBox1.Checked[1] then
    str:=str + ´ABCDEFGHIJKLMNOPQRSTUVWXYZ´;
  if str = ´´ then
  begin
    showmessage(´escolha um ao menos !!´);
    exit;
  end;
  RichEdit1.Lines.Clear;
  for j:=1  to SpinEdit1.Value do
  begin
    s:=´´;
    max:= 6 + random(8);
    for i:=1 to max do
      s:= s + str[random(length(str))+1];
    RichEdit1.Lines.Add(s);
  end;
end;



Responder

Gostei + 0

01/04/2005

Vitor Rubio

Valew! Vou aplicar sua sugestão. Ela me deu umas idéias para usar esse numero de outras formas também.


Responder

Gostei + 0

01/04/2005

Michael

Olá colega Vitor!

Talvez haja uma solução menos trabalhosa e mais eficiente para o seu problema. Vamos lá:

O Delphi possui a função [b:9d1c42ef5c]Random[/b:9d1c42ef5c], que retorna um número aleatório baseado na hora interna da BIOS - como ele faz isso é irrelavante aqui. É claro que vc não poderia simplesmente chamar Random pois os números seriam passíveis de repetição. E aí que entra a variável global [b:9d1c42ef5c]RandSeed[/b:9d1c42ef5c]. Como o próprio nome diz, ela alimenta o gerador randômico da função Random. RandSeed é inicializada apenas uma vez quando um aplicativo Delphi é carregado, portanto, todas as chamadas a Random retornarão o mesmo valor. Para contornar isso, também há a procedure [b:9d1c42ef5c]Randomize[/b:9d1c42ef5c], que trata de alterar os valores de RandSeed, dando a Random um caráter aleatório de fato.

Bom, Randomize insere vários valores em RandSeed, repetidos ou não. Se vc, manualmente, inserir sempre o mesmo valor, então Random também irá retornar sempre o mesmo valor.

De qualquer forma não há nada automático. Vc teria que criar um valor - usando uma lógica como a do colega Motta - e inserí-lo em RandSeed. Depois, Random faz o resto.

Quanto a retornar a data do servidor de banco de dados, pesquise no fórum por ´data servidor´. Tem muitas soluções lá

Mas teste minha idéia. Talvez ela não se encaixe em seu caso.

Abraços!


Responder

Gostei + 0

01/04/2005

Gandalf.nho

Para pegar informações de data e hora no IB/FB:

CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP


Responder

Gostei + 0

01/04/2005

Motta

O problema de um valor aleatorio é que a chave tem de ter valor grande para minimizar o risco de colisão.

Ainda acho que um objeto como a sequence é mais simples.


Responder

Gostei + 0

01/04/2005

Beppe

Tem um ´problema´ com numéros aleatórios(pseudo ou não), que eles não são necessariamente gerados de forma crescente. Na minha opinião ou usa-se generator ou data(da forma que o Motta sugeriu as chaves serão crescentes).


Responder

Gostei + 0

01/04/2005

Michael

Se não me engano, se a chave usada for sempre crescente, os valores gerados tbm serão.

[]´s


Responder

Gostei + 0

01/04/2005

Beppe

Se não me engano, se a chave usada for sempre crescente, os valores gerados tbm serão. []´s

Michael, se vc tiver interesse sobre como funciona o gerador de números aleatórios no Delphi, escrevi um artigo sobre o assunto: http://www.forumweb.com.br/artigos/artigos.php?action=file&id=291

Também há uma discussão sobre o mesmo: http://www.forumweb.com.br/foruns/index.php?showtopic=24599&hl=

Em suma, um PRNG deve dar a mesma probabilidade de ocorrência a qualquer número no universo. Se ´sempre crescente´ for uma restrição, a propriedade de randomicidade fica comprometida.

Só uma coisa que não entendi no seu último post...que chave se referia?


Responder

Gostei + 0

02/04/2005

Michael

Michael, se vc tiver interesse sobre como funciona o gerador de números aleatórios no Delphi, escrevi um artigo sobre o assunto: http://www.forumweb.com.br/artigos/artigos.php?action=file&id=291 (...)


Olá Beppe!

Com certeza irei dar uma olhada nos links que vc falou.

A minha idéia é de que os números aleatórios fossem sempre maiores que os anteriores. Por isso disse ´crescente´. Tipo, 1, 4, 6, 9, 18 etc.

A chave que eu disse é a variável global RandSeed, que controla como Random funciona.

[]´s


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar