短URL生成

网页长URL分享时,对用户不友好,同时给同一个长URL生成多个短URL,每个短URL对应一个引流渠道,提升用户体验的同时,便于商业数据分析。

短URL设计

为长URL生成不重复的短URL,使用62进制编码,使用0-9, A-Z, a-Z表示0-61。为保持短URL的简洁性,假定短URL长度为6,此时可以生成6265.68×1010,约568亿个短URL。虽然可支持的URL数据已经足够多,但考虑到长URL中可以包含查询字符串和路径参数,导致长URL本身可变范围较大,需要的短URL规模也相应地增大,同时短URL具有一定的时效性,所以短URL需要支持过期回收重用。

 

实时哈希生成

URL 利用 MD5 或者 SHA256 等单项散列算法,得到 128bit 或者 256bit 的 Hash 值。然后对该 Hash 值进行 Base64 编码,得到 22 个或者 43 个 Base64 字符,再根据某种规则得到 6 个字符作为短URL

该方式可能会发生 Hash 冲突,即不同的长 URL,计算得到相同的短URL。对此需要事先校验该短URL 是否已经映射为其他的长 URL,如果是,则需要重新计算得到新的短 URL, 再重复上述查重过程,直至得到不重复的短URL。该方法需要在生成短URL时,实时查重验证并重试,存在性能瓶颈。

 

离线生成缓存

离线预先生成全部可选的6位短URL,获取短URL时直接返回预先生成的缓存结果。假设需要生成n=20000000000个短URL,可以通过生成200亿个不重复的1到q=40000000000范围内的随机数,并将其转换为62进制编码,得到200亿个短URL,同时需要保证生成的随机数序列乱序,防止短URL被外界预测。离线生成短URL可以有下面两种方式:

 

重复随机生成+布隆过滤器去重
递增序列+随机乱序

验证

附录

 

参考