TinyURL is a URL shortening service where you enter a URL such as https://leetcode.com/problems/design-tinyurl
and it returns a short URL such as http://tinyurl.com/4e9iAk
.
Design the encode and decode methods for the TinyURL service. There is no restriction on how your encode/decode algorithm should work. You just need to ensure that a URL can be encoded to a tiny URL and the tiny URL can be decoded to the original URL.
Solutions (Click to expand)
The most simplest solution would involve converting the longUrl
into a short unique hash a short unique hash and mapping the hash to the longUrl
in a key value data structure (RDBMS or HashMap)
With Java we can use the builin hashCode
method on the incoming longUrl
and take the first 8 characters as the unique shortUrl
store the longUrl
in a data structure indexed with its shortUrl
.
When a longUrl
is requested we will get the longUrl
from memory by acessing it by the given shortUrl
Since hashCode
is subject to hash collisions we can create a new MD5
hash out of the longUrl
before converting encoding it into Base64
. giving us a total of 64^8
(for an 8 character long shortUrl) available shortUrls. Since we don't want two requests of the same longUrl
to give back the same shortUrl
. We will append a incrementing counter
that will be appended to the longUrl
before being hashed by MD5
.
After encoding the string to Base64
we will take the first 8 characters as our 8-character shortUrl
and map it to the longUrl