entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

1voto

Generar cadena de caracteres para acortar artículo en sitio web

Buenas colegas estoy haciendo un algoritmo que me genere una secuencia de caracteres de cuatro lugares dado una cadena de [a..zA..Z0..9] para tener una referencia acortada para mis artículos en mi sitio. Actualmente utilizo un algoritmo ineficiente que ya me a puesto acortadores de 3 lugares sin llenar la cantidad de los de uno. Dado que tengo mi array base de 62 cuando el mismo llegue a 4 lugares entonces el último acortador que sería 9999 tendría el artículo número 626262*62= 14776336 cantidad que creo nunca alcanzar en el sitio ;)
Esta es la idea y mi problema radica a partir de la segunda secuencia para comenzar la tercera es decir cuando termina 99 y comienza aaa.
Este es mi código en php:

function __gen(){ # Genera le shortlink adecuadamente
        $base = array(
            'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
            'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
            'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
            'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'
        );
        $ini = 0;        
        $spacers = 0;
        $Bbeta = '';
        $beta = '';
        for ($i=0; $i <= count($base); $i++) { 
            #1 compara si existe el shortlink nuevo
            $beta = $Bbeta.$base[$i];
            /*if ($this->__exist($beta) == 0) { //Este método me retorna la cantidad de veces que existe el acortador en mi db 
                return $beta;
            }*/
            #2 compara si se terminó la fase de comprobación y setea el inicio
            if($i == count($base)-1){
                if ($ini = count($base)) {
                    $spacers++;                                         
                }               
                $Bbeta = $base[$ini];
                $ini++;
                $i = 0;             
                #3 valora si se aumenta o no el spacers opción relacionada con el caracter ultimo '9'
                #Compara todos los caracteres a ver si son 9 y en caso de serlo entonces aumentar spacers               
            }
            var_dump($beta);
        }
}  

como verán mi problema es a partir de mi paso #3 comparo que todo sea 9 en el string y luego como sigo mi secuencia para que continué de la siguiente forma:
aaa .. aa9
aba .. ab9
a9a .. a99
baa .. ba9
bba .. bb9
y así hasta llegar a 999 para luego pasar a cuatro lugares de aaaa a 9999.
Saludos Dairon

1 Respuesta

2votos

carlossevi Puntos63580

¿Qué te parece manejar el problema como un cambio de base? Imagina que tienes un contador numérico para la direcciones cortas asignadas: 1, 2, 3...

Ese contador es muy fácil de gestionar, almacenar, autoincrementar... incluso tu gestor de base de datos se encargará de facilitarte el siguiente número.

Ahora bien, una vez tienes asignado un número para la URL acortada, ese número se puede expresar en diferentes bases. Por ejemplo, el número 30 en base decimal puede representarse como:

11110 en binario
30 en base decimal
1E en hexadecimal

En tu acortador te vas a "inventar" una nueva representación, en base 62 (62 caracteres de representación diferentes) con tu propio alfabeto.

Podrías convertirlo con la siguiente función:

function shorten($id)
{
    $alphabet = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    $base = strlen($alphabet);
    $shortenedId = '';
    while($id>0) {
        $remainder = $id % $base;
        $id = ($id-$remainder) / $base;     
        $shortenedId = $alphabet{$remainder} . $shortenedId;
    };
    return $shortenedId;
}

Con esa función la URL número 30 se representará como E en tu sistema.

La parte negativa de este sistema es que si cambia el alfabeto cambia la representación de todos los números/URLs.

0voto

dairon comentado

voy a comenzar a probar tu algoritmo para ver como resulta ;)

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta