Chcę utworzyć usługę skracania adresów URL, w której możesz wpisać długi adres URL w polu wejściowym, a usługa skróci adres URL do „ http://www.example.org/abcdef
”.
Zamiast „ abcdef
” może znajdować się dowolny ciąg zawierający sześć znaków a-z, A-Z and 0-9
. To daje 56 ~ 57 miliardów możliwych ciągów.
Moje podejście:
Mam tabelę bazy danych z trzema kolumnami:
- id, liczba całkowita, auto-inkrement
- długi, ciąg, długi URL podany przez użytkownika
- krótki, ciąg znaków, skrócony adres URL (lub tylko sześć znaków)
Następnie wstawiłbym długi adres URL do tabeli. Następnie wybrałbym wartość automatycznego przyrostu dla „ id
” i zbudowałem jej skrót. Ten skrót należy następnie wstawić jako „ short
”. Ale jaki hash powinienem zbudować? Algorytmy skrótu, takie jak MD5, tworzą zbyt długie ciągi znaków. Myślę, że nie używam tych algorytmów. Algorytm samokonstruujący również będzie działał.
Mój pomysł:
Dla „ http://www.google.de/
” otrzymuję identyfikator automatycznego przyrostu 239472
. Następnie wykonuję następujące kroki:
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.
Można to powtarzać, dopóki liczba nie będzie już podzielna. Czy uważasz, że to dobre podejście? Czy masz lepszy pomysł?
Ze względu na ciągłe zainteresowanie tym tematem opublikowałem wydajne rozwiązanie dla GitHub , z implementacjami dla JavaScript , PHP , Python i Java . Dodaj swoje rozwiązania, jeśli chcesz :)
encode()
idecode()
funkcje. Kroki są zatem następujące: (1) Zapisz adres URL w bazie danych (2) Uzyskaj unikalny identyfikator wiersza dla tego adresu URL z bazy danych (3) Konwertuj liczbę całkowitą na krótki ciągencode()
, np.273984
Naf5a4
(4) Użyj krótkiego ciągu (np.f4a4
) W swoim współdzielone adresy URL (5) Po otrzymaniu żądania krótkiego ciągu (np.20a8
) dekoduj ciąg do identyfikatora liczb całkowitych za pomocądecode()
(6) Wyszukaj adres URL w bazie danych dla danego identyfikatora. Do konwersji użyj: github.com/delight-im/ShortURL