Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Olá pessoal,
Gostaria de saber uma função bem simples para gerar códigos com tamanho de 8 dígitos;
Agradeço.
time() ... pra ter o mesmo numero soh ceh for criado no mesmo minuto segundo e tal... em localhost eh bastante provavel que aconteça ... em servidores acho dificil... mas pra garanti concatena com mais um numero ... e pra dexa a quantia de caracter que você quer da pra usa substr... exemplo
$a= time();
$numero = substr($a,4,10).'1';
$aa= time();
$numero2 = substr($aa,4,10).'2';
valww espero ter ajudadoeu uso
md5(uniqid(time()));
assim tem muito mais chance de "nunca" repetir minha chave, pq 32 digitos do md5 alem de seguranca tem o uniqid
nenhum das respostas enquandram-se nas especificações
- código único
- 8 caracteres
- somente numerico
: md5 e uniqid geram alfanumericos
: utilizar substr() para cortar a string poderá aumentar probabilidade de repetição do id
pesquise por técnicas de "Service Tag".
empresas de gande porte utilizam "Service Tag" apra facilicar a leitura e compreensão de um código de barras, por exemplo.
Serviço de Service Tag da DEll:
http://support.dell.com/support/topics/glo...l=en&s=hied
http://support.dell.com/support/topics/glo...amp;~mode=popup
interessante script que converte o service tag da Dell
http://www.powerdog.com/dellconv.cgi
outro link no forum
pq nao poen logo 10 caracters no campo usa time() e deu... nao vai precisa faze tanta ganbiara .... pois o dia 07 do 04 de 2009 as 10 e 40 aos 41 segundos ...nunca mais vai se repeti ^^ oq pod acontece como eu dise eh você cadastra mais de um registro e o sistema executa os dois no mesmo segundo ... ae ele se repetiria... mas como ja mostrei no post anterior eh so concatena mais um algarismo diferente em cada e deu ... garantido ( a nao ser que encontre a " maquina do tempo "^^ ) que nao vai se repeti ...
Muito obrigado pessoal, vou testar os códigos.
é gambiarra, é sujo, é porco mais funciona se for sistema pequeno pega nada =x
gera um numero com microtime, pega os 8 ultimos algo do tipo checa o banco se tiver gera outro =x
algo 100% que garanta NUNCA repetir é algo trabalhoso, essa forma ai acho que já resolve, mais se o sistema é muito grande, do tipo que vai receber muitos inserts simultâneos, não recomendo, enfia a cara para uma solução melhor...
Olá pessoal,
Complementei esta função aqui, e pelo que andei vendo a possibilidade de um acerto é muito pequena.
<?php
function make_seed()
{
list($usec, $sec) = explode(' ', microtime());
return (float) $sec + ((float) $usec * 100000);
}
mt_srand(make_seed());
$randval = mt_rand(11111,99999);
$randval2 = mt_rand(9999,1111);
$hr = date('s');
$codigo = "$randval"."$randval2"."$hr";
echo "$codigo";
?>
Isto será usado na inserção de um cliente no banco de dados.resumindo esse code, ficaria assim:
function foo()
{
return mt_rand(11111,99999) . mt_rand(9999,1111) . date('s');
}
echo foo();num teste com 400 mil loops, houve 1 duplicado
em outros testes com 100 mil loops, muitas vezes nao gerava nenhum duplicado, porém, as vezes retornava 1 ou 20 duplicados
em testes com 1000 loops a mesma coisa.
Apesar de incidências baixas, cada teste foi feito separadamente, correndo em tempo real, sem comparar com dados já testados em cada loop.
É um método bastante inseguro, pois assim comos números, as chances de erro também são aleatórias.
Outra desvantagem está no uso de IDs longos. A indexação de registros se torna mais lenta.
Isto será usado na inserção de um cliente no banco de dados
mesmo numa empresa multinacional,
um banco de dados com 600 milhões de clientes é muito.
sites como facebook, orkut, myspace possuem +- essa quantidade de cadastros, incluindo contas inativas
um campo autoincrement com 9 casas seria suficiente para suportar até 999.999.999 cadastros
veja o que for viável para o seu caso