题目
设计一个简单的短链接生成服务
信息
- 类型:问答
- 难度:⭐
考点
哈希算法应用, 键值存储设计, 基础系统组件
快速回答
实现一个短链接服务的核心要点:
- 使用Base62编码将自增ID转换为短字符串
- 采用键值存储(如HashMap)映射短码到原始URL
- 服务包含两个主要端点:
1./shorten- 接收长URL返回短码
2./{shortCode}- 重定向到原始URL - 添加基础校验确保URL格式合法
1. 核心原理
短链接系统通过生成紧凑的字符串替代长URL,关键技术点:
- 短码生成:使用自增ID配合Base62编码(A-Z,a-z,0-9共62字符)
- 存储映射:短码作为Key,原始URL作为Value的键值对
- 重定向机制:HTTP 301/302重定向实现跳转
2. 代码示例(Python伪代码)
# 存储结构(内存示例,实际可用Redis/DB)
url_map = {}
id_counter = 100000 # 初始ID
def base62_encode(num):
charset = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
short_code = ""
while num > 0:
num, rem = divmod(num, 62)
short_code = charset[rem] + short_code
return short_code
def shorten_url(long_url):
global id_counter
# 生成短码
id_counter += 1
short_code = base62_encode(id_counter)
# 存储映射
url_map[short_code] = long_url
return f"https://short.url/{short_code}"
def redirect(short_code):
long_url = url_map.get(short_code)
if long_url:
return HTTP_301_REDIRECT(long_url) # 永久重定向
else:
return "404 Not Found"3. 最佳实践
- 重定向选择:301(永久重定向)利于SEO,302(临时)便于统计
- 输入校验:验证URL格式(正则示例:
^https?://[^\s/$.?#].[^\s]*$) - 短码长度:6-8字符(Base62可表示568亿+组合)
4. 常见错误
- 哈希冲突:自增ID+编码可避免(优于MD5截取)
- 未处理重复URL:相同长URL应返回相同短码(添加缓存检测)
- 缺少过期机制:实际系统需添加TTL自动清理
5. 扩展知识
- 分布式扩展:通过分片键(如短码首字母)分割数据
- 自定义短码:允许用户指定易记字符串(需检查唯一性)
- 访问统计:在重定向时记录点击量(需异步处理)