TinyURL的生成

Encode and Decode TinyURL

这题很有意思。

题目大意是实现一个长链接和短链接的转化。

形式是 http://tinyurl.com/4e9iAk。 只有6位标志包含(0-9),(a-z),(A-Z)

一位有10+26+26 = 62种值。 6位的总数大致是 62^6 - 1。

思路1. 哈希

既然我们想到了hash,就需要搞明白 URL的字符集,就是说URL中有可能会出现哪些字符。发现题目不控制长链接的长度,再加上URL的字符集也超过了62种。只有6位的话,再高明的hash也难免冲突

思路2. 自增ID

62^6次 大约为 2^32 左右。能发放2^32个ID。

自增的问题在于不可逆。

短链无法逆算出长链,存在这个需求的话需要将ID和长链接关联存储起来。

自增在单点服务器上需要加锁,避免多线程访问ID重复。hash没有这个问题,hash算法保证唯一性。加锁QPS高的情况下,会出现排队等待的情况。分布式支持高QPS,不考虑分布式锁同步的话:

有这种的思路:发单双号ID。A服务器只发单号,B服务器只发双号。类比你集群有多少台服务器。

Raw 535. Encode and Decode TinyURL.cpp