Implement A Url-shortener With Tracking And A Stat Endpoint
Url shortener is a typical web service, making long links short and sweet. There are quite a few service providers for it, e.g. Bitly, Google, and TinyURL.com.
In this post, I’d like to show you how I implemented a basic URL-shortening service and some of my thoughts along the way.
I start my implementation by googling how others have done it and came across Jeff Atwood’s postURL Shortening: Hashes In Practice
. And in that post, he talked about his thoughts on the subject matter, such as how normal hashing couldn’t work and his guess, which is My guess is the aggressive URL shortening services are doing a simple iteration across every permutation of the available characters they have as the URLs come in.
.
It’s a fun read and some great considerations, but the comments section taught me more. It gave me the idea that the key could be just an auto incremental number in a SQL table and outputted in a string format. For example, id 37815042
could be encoded as 2yFq2
in base62(0-9, a-z, A-Z) format.
A table is added below to illustrate the idea.
number | value |
---|---|
1 | 1 |
10 | a |
100 | 1C |
1000 | g8 |
10000 | 2Bi |
100000 | q0U |
1000000 | 4c92 |
10000000 | FXsk |
100000000 | 6LAze |
So for every single new URL, the database will save the value and keep it unique, assign a simple incremental id to the URL, and lastly return the base62 result as the tiny URL.
A sample implementation in Rails 5 could be found at here.