Voglio creare un servizio di accorciamento URL in cui è possibile scrivere un URL lungo in un campo di input e il servizio accorcia l'URL a " http://www.example.org/abcdef
".
Invece di " abcdef
" può esserci qualsiasi altra stringa contenente sei caratteri a-z, A-Z and 0-9
. Ciò rende possibili 56 ~ 57 miliardi di stringhe.
Il mio approccio:
Ho una tabella di database con tre colonne:
- id, numero intero, incremento automatico
- long, string, l'URL lungo inserito dall'utente
- breve, stringa, l'URL abbreviato (o solo i sei caratteri)
Vorrei quindi inserire l'URL lungo nella tabella. Quindi selezionerei il valore di incremento automatico per " id
" e ne creerei un hash. Questo hash dovrebbe quindi essere inserito come " short
". Ma che tipo di hash dovrei costruire? Gli algoritmi di hash come MD5 creano stringhe troppo lunghe. Non uso questi algoritmi, credo. Funzionerà anche un algoritmo autocostruito.
La mia idea:
Per " http://www.google.de/
" Ottengo l'id di incremento automatico 239472
. Quindi faccio i seguenti passi:
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.
Ciò potrebbe essere ripetuto fino a quando il numero non sarà più divisibile. Pensi che questo sia un buon approccio? Hai un'idea migliore?
A causa del continuo interesse per questo argomento, ho pubblicato una soluzione efficiente per GitHub , con implementazioni per JavaScript , PHP , Python e Java . Aggiungi le tue soluzioni se ti piace :)
encode()
edecode()
funzioni. I passaggi sono quindi: (1) Salva URL nel database (2) Ottieni un ID riga univoco per quell'URL dal database (3) Converti l'ID intero in stringa breve conencode()
, ad esempio273984
inf5a4
(4) Usa la stringa breve (ad esempiof4a4
) nel tuo URL condivisibili (5) Quando si riceve una richiesta per una stringa breve (ad es.20a8
), decodificare la stringa in un ID intero condecode()
(6) Cercare l'URL nel database per un determinato ID. Per la conversione, utilizzare: github.com/delight-im/ShortURL