2011-03-24 23 views
9

Después de usar sitios como JSFiddle noté que generan automáticamente una URL única y aleatoria formada por varios caracteres en mayúscula y minúscula.Nombres de URL aleatorios de PHP (URL corta)

Podríamos beneficiarnos de esto para nuestras páginas de reserva. ¿Cómo se hace?

Respuesta

20

Esto no es aleatorio, ya que se basa en el ID de su registro de base de datos.

como funciona:

, básicamente, que tienen una cadena que es único pero que se puede descifrar para representar un número, usted debe mirar como un cifrado corto/descifrado.

Tiene una función que tomaría una ID única y luego crea una "cadena corta" única de esa identificación, y luego puede revertir el proceso para obtener la identificación única de la cadena corta.

Aquí hay un cortado con tijeras he encontrado de un sitio web:

function alphaID($in, $to_num = false, $pad_up = false, $passKey = null) 
{ 
    $index = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
    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; 
} 

Ejemplo

alphaID(9007199254740989); //-> PpQXn7COf 
alphaID('PpQXn7COf', true); //-> 9007199254740989 

hay un enlace a la secuencia de comandos aquí: https://github.com/kvz/deprecated/blob/kvzlib/php/functions/alphaID.inc.php

0

Podrías simplemente crear una matriz de todos los caracteres potenciales, luego seleccionar aleatoriamente cuantos quieras y devolverlos como el "código" de la URL?

 
$arr = array('a','b','c','d'); 
$count = count($arr) - 1; 
$str = $arr[rand(0, $coun)].$arr[rand(0, $coun)]; 
+0

pero esto podría llevar a una duplicación cuerdas (aunque no muy probable). – acme

+0

¿Eso importa? Lo único que tendría que hacer es verificar para asegurarse de que sea único por algún método (como la búsqueda de base de datos, si se almacena de esa manera). – Alex

2

utilizar la función uniqid() si lo que desea es un identificador aleatorio de una longitud especificada o uso el hash md5() de su larga url si necesita algo repetible. (salida siempre igual para una entrada dada). Creating a short URL service using PHP and MySQL da un buen resumen de cómo ponerlo todo junto.

1

Es muy simple.

su URL es algo así como www.domain.com/in/here/RANDOMPART

reescribir www.domain.com/in/here/* a una secuencia de comandos de su elección. En este script, puede obtener el uri solicitado con los globales y puede dividirlo y usar la parte después del último '/'. Esta es tu RANDOMPART. Debes verificarlo contra tu DB o lo que sea.

Para crear una url, simplemente tiene que agregar algo detrás de "www.domain.com/in/here/". Podrías generar una cadena con la esperanza de ser única con md5(uniqid(rand(), true)).

No olvides guardar esta cadena en una base de datos o lo que sea.

Espero, eso ayuda.

1

Algo a lo largo de estas líneas:

<?php 
    $url_length = rand(10,20); //generate a random number between 10 and 20 for the length of the URL 
    $url = array($url_length); 
    for($i=0; $i < $url_length; $i++) 
    { 
    $char = 0; 
    while($char < 65 OR $char > 122 OR ($char > 91 AND $char < 97)) 
    { 
     $char = rand(65,122); 
    } 
    $url[] = chr($char); 
    } 
    print_r($url); 
?> 

Nota esto es parcialmente pseudo código. Esto crea una URL con una longitud aleatoria (entre 10 y 20) y rellena cada carácter con un código ASCII aleatorio que corresponde a una letra en el alfabeto. Hay algunos caracteres "basura" entre las letras mayúsculas y minúsculas en la tabla ASCII, por lo que se volverá a desplegar un número aleatorio hasta que se genere un número ASCII válido.

Esto supone que está almacenando esta URL en una base de datos. Para garantizar que esta cadena sea única, debe verificar si aún existe en la base de datos. Si no es así, agrégalo y estarás bien. Si existe, vuelva a realizar el proceso hasta que obtenga una cadena única.