LC535 - Encode and Decode TinyURL

Description

Note: This is a companion problem to the System Design problem: Design TinyURL.
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 a class to encode a URL and decode a tiny URL.
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.
Implement the Solution class:
Solution() Initializes the object of the system.
String encode(String longUrl) Returns a tiny URL for the given longUrl.
String decode(String shortUrl) Returns the original long URL for the given shortUrl. It is guaranteed that the given shortUrl was encoded by the same object.

Example 1:
Input: url = “https://leetcode.com/problems/design-tinyurl
Output: “https://leetcode.com/problems/design-tinyurl
Explanation:
Solution obj = new Solution();
string tiny = obj.encode(url); // returns the encoded tiny url.
string ans = obj.decode(tiny); // returns the original url after deconding it.

Constraints:
1 <= url.length <= 104
url is guranteed to be a valid URL.

Solution

  • Hash algorithm, accepts incoming content, and obtains a string of hash values after operation
    • As long as the incoming content is the same, the obtained hash value must be the same
    • Cannot be converted into content by hash value
    • As long as the hash algorithm used remains the same, the length of the obtained hash value is fixed no matter how large the content to be verified is
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import hashlib
class Codec:
def __init__(self):
self.map = {}

def encode(self, longUrl: str) -> str:
"""Encodes a URL to a shortened URL.
"""
message = longUrl.encode()
en = hashlib.md5(message).hexdigest()
self.map[en] = longUrl
return f"https://hex.com/{en}"


def decode(self, shortUrl: str) -> str:
"""Decodes a shortened URL to its original URL.
"""
key = shortUrl.split("/")[-1]
return self.map[key]

# Your Codec object will be instantiated and called as such:
# codec = Codec()
# codec.decode(codec.encode(url))

Notes

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import hashlib

# encode it to bytes using UTF-8 encoding
message = "Some text to hash".encode()
# hash with MD5 (not recommended)
print("MD5:", hashlib.md5(message).hexdigest())
# hash with SHA-2 (SHA-256 & SHA-512)
print("SHA-256:", hashlib.sha256(message).hexdigest())
print("SHA-512:", hashlib.sha512(message).hexdigest())
# hash with SHA-3
print("SHA-3-256:", hashlib.sha3_256(message).hexdigest())
print("SHA-3-512:", hashlib.sha3_512(message).hexdigest())
# hash with BLAKE2
# 256-bit BLAKE2 (or BLAKE2s)
print("BLAKE2c:", hashlib.blake2s(message).hexdigest())
# 512-bit BLAKE2 (or BLAKE2b)
print("BLAKE2b:", hashlib.blake2b(message).hexdigest())