Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Gabriel Jacinto

[Resolvido] Gerando códigos

Recommended Posts

Olá pessoas!

Então, estou com uma dúvida.

Queria saber, tipo, estou criando um encurtador de URL, mas queria saber se ao gerar um código qualquer pra ser a URL encurtada, daria pra verificar no banco de já existe um código igual, se já existir, gera outro e assim por diante. Teria como?

Compartilhar este post


Link para o post
Compartilhar em outros sites

sim, é possível. Qual a dúvida?

 

 

Na verdade, eu te sugiro algo mais simples. Trabalhe de forma sequencial.

Primeira url:

 

site.com/1

site.com/2

 

Então você sempre fará um select antes de tudo. A próxima URL é um incremento da anterior.

Feito isso, faça um insert da próxima URL.

 

Lembre-se de trabalhar com letras para aumentar o número de possibilidades.

Uma regra simples seria:

 

site.com/1

site.com/2

..

site.com/9

site.com/a

site.com/b

...

site.com/z

site.com/1z

site.com/2z

...

site.com/9z

site.com/az

 

 

 

Entendeu a minha sugestão de algorítmo ?

Compartilhar este post


Link para o post
Compartilhar em outros sites

pode usar o AUTO INCREMENT do banco.

 

Basta pegar o valor do auto increment, e você escrever um algoritmo que traduza esse INTEIRO para a string com as letras.

Compartilhar este post


Link para o post
Compartilhar em outros sites

sim, é possível. Qual a dúvida?

 

 

Na verdade, eu te sugiro algo mais simples. Trabalhe de forma sequencial.

Primeira url:

 

site.com/1

site.com/2

 

Então você sempre fará um select antes de tudo. A próxima URL é um incremento da anterior.

Feito isso, faça um insert da próxima URL.

 

Lembre-se de trabalhar com letras para aumentar o número de possibilidades.

Uma regra simples seria:

 

site.com/1

site.com/2

..

site.com/9

site.com/a

site.com/b

...

site.com/z

site.com/1z

site.com/2z

...

site.com/9z

site.com/az

 

 

 

Entendeu a minha sugestão de algorítmo ?

 

Consegui fazer isso usando um hash reversível, assim, de acordo com o id da URL, assim:

function alphaID($in, $to_num = false, $pad_up = false, $passKey = null)
       {
               $index = "abcdefghijklmnopqrstuvwxyz0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
               if ($passKey !== null) {
                       // Although this function's purpose is to just make the
                       // ID short - and not so much secure,
                       // with this patch by Simon Franz (http://blog.snaky.org/)
                       // you can optionally supply a password to make it harder
                       // to calculate the corresponding numeric ID

                       for ($n = 0; $n<strlen($index); $n++) {
                               $i[] = substr( $index,$n ,1);
                       }

                       $passhash = hash('sha256',$passKey);
                       $passhash = (strlen($passhash) < strlen($index))
                               ? hash('sha512',$passKey)
                               : $passhash;

                       for ($n=0; $n < strlen($index); $n++) {
                               $p[] =  substr($passhash, $n ,1);
                       }

                       array_multisort($p,  SORT_DESC, $i);
                       $index = implode($i);
               }

               $base  = strlen($index);

               if ($to_num) {
                       // Digital number  <<--  alphabet letter code
                       $in  = strrev($in);
                       $out = 0;
                       $len = strlen($in) - 1;
                       for ($t = 0; $t <= $len; $t++) {
                               $bcpow = bcpow($base, $len - $t);
                               $out   = $out + strpos($index, substr($in, $t, 1)) * $bcpow;
                       }

                       if (is_numeric($pad_up)) {
                               $pad_up--;
                               if ($pad_up > 0) {
                                       $out -= pow($base, $pad_up);
                               }
                       }
                       $out = sprintf('%F', $out);
                       $out = substr($out, 0, strpos($out, '.'));
               } else {
                       // Digital number  -->>  alphabet letter code
                       if (is_numeric($pad_up)) {
                               $pad_up--;
                               if ($pad_up > 0) {
                                       $in += pow($base, $pad_up);
                               }
                       }

                       $out = "";
                       for ($t = floor(log($in, $base)); $t >= 0; $t--) {
                               $bcp = bcpow($base, $t);
                               $a   = floor($in / $bcp) % $base;
                               $out = $out . substr($index, $a, 1);
                               $in  = $in - ($a * $bcp);
                       }
                       $out = strrev($out); // reverse
               }

               return $out;
       }

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.