Tôi muốn tạo một dịch vụ rút ngắn URL, nơi bạn có thể viết một URL dài vào trường nhập và dịch vụ rút ngắn URL thành "http://www.example.org/abcdef
".
Thay vì " abcdef
" có thể có bất kỳ chuỗi nào khác có sáu ký tự chứa a-z, A-Z and 0-9
. Điều đó làm cho 56 ~ 57 tỷ chuỗi có thể.
Cách tiếp cận của tôi:
Tôi có một bảng cơ sở dữ liệu với ba cột:
- id, số nguyên, tự động tăng
- dài, chuỗi, URL dài người dùng đã nhập
- ngắn, chuỗi, URL rút ngắn (hoặc chỉ sáu ký tự)
Sau đó tôi sẽ chèn URL dài vào bảng. Sau đó, tôi sẽ chọn giá trị tăng tự động cho " id
" và tạo giá trị băm của nó. Băm này sau đó nên được chèn là "short
". Nhưng tôi nên xây dựng loại băm nào? Các thuật toán băm như MD5 tạo ra các chuỗi quá dài. Tôi không sử dụng các thuật toán này, tôi nghĩ vậy. Một thuật toán tự xây dựng cũng sẽ làm việc.
Ý kiến của tôi:
Đối với " http://www.google.de/
" Tôi nhận được id tăng tự động 239472
. Sau đó, tôi làm các bước sau:
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.
Điều đó có thể được lặp lại cho đến khi số không chia hết được nữa. Bạn có nghĩ rằng đây là một cách tiếp cận tốt? Bạn có ý kiển nào tốt hơn không?
Do sự quan tâm liên tục trong chủ đề này, tôi đã xuất bản một giải pháp hiệu quả cho GitHub , với các triển khai cho JavaScript , PHP , Python và Java . Thêm giải pháp của bạn nếu bạn thích :)
encode()
vàdecode()
chức năng. Các bước thực hiện, do đó: (1) Lưu URL trong cơ sở dữ liệu (2) Nhận ID hàng duy nhất cho rằng URL từ cơ sở dữ liệu (3) Chuyển đổi số nguyên ID để chuỗi ngắn vớiencode()
, ví dụ như273984
đểf5a4
(4) Sử dụng các chuỗi ngắn (ví dụf4a4
) trong bạn URL có thể chia sẻ (5) Khi nhận được yêu cầu về một chuỗi ngắn (ví dụ20a8
), hãy giải mã chuỗi thành ID số nguyên vớidecode()
(6) Tra cứu URL trong cơ sở dữ liệu cho ID đã cho. Để chuyển đổi, hãy sử dụng: github.com/delight-im/ShortURL