Quiero crear un servicio de acortador de URL donde pueda escribir una URL larga en un campo de entrada y el servicio acorta la URL a " http://www.example.org/abcdef
".
En lugar de " abcdef
" puede haber cualquier otra cadena que contenga seis caracteres a-z, A-Z and 0-9
. Eso hace que 56 ~ 57 mil millones de cadenas posibles.
Mi acercamiento:
Tengo una tabla de base de datos con tres columnas:
- id, entero, incremento automático
- long, string, la URL larga que ingresó el usuario
- short, string, la URL acortada (o solo los seis caracteres)
Luego insertaría la URL larga en la tabla. Luego seleccionaría el valor de incremento automático para " id
" y crearía un hash de él. Este hash se debe insertar como " short
". Pero, ¿qué tipo de hash debo construir? Algoritmos hash como MD5 crean cadenas demasiado largas. No uso estos algoritmos, creo. Un algoritmo de construcción propia también funcionará.
Mi idea:
Para " http://www.google.de/
" obtengo la identificación de incremento automático 239472
. Luego hago los siguientes pasos:
short = '';
if divisible by 2, add "a"+the result to short
if divisible by 3, add "b"+the result to short
... until I have divisors for a-z and A-Z.
Eso podría repetirse hasta que el número ya no sea divisible. ¿Crees que este es un buen enfoque? Tienes una mejor idea?
Debido al continuo interés en este tema, he publicado una solución eficiente para GitHub , con implementaciones para JavaScript , PHP , Python y Java . Agregue sus soluciones si lo desea :)
encode()
ydecode()
funciones. Los pasos son, por lo tanto: (1) Guardar URL en la base de datos (2) Obtener una ID de fila única para esa URL de la base de datos (3) Convertir la ID entera en una cadena corta conencode()
, por ejemplo,273984
af5a4
(4) Usar la cadena corta (por ejemplof4a4
) en su URL compartibles (5) Al recibir una solicitud de una cadena corta (p20a8
. ej. ), decodifique la cadena a una ID entera condecode()
(6) Buscar URL en la base de datos para la ID dada. Para la conversión, use: github.com/delight-im/ShortURL