一、问题背景
将长 URL(如 https://example.com/very/long/path?param=xxx)转换为短链接(如 https://s.cn/Ab3xK9),用户访问短链接时重定向到原始 URL。
核心需求:
- 生成的短码唯一且尽可能短
- 生成速度要快(高并发写入)
- 重定向查询要快(高频读取)
- 短码不可预测(安全性)
二、方案一:哈希算法
2.1 思路
对长 URL 做哈希,取哈希值的一部分作为短码。
Mermaid · 渲染中(下方为源码)
graph LR U[长URL] --> H[哈希函数] H --> C[取后6位] C --> S[短码]
2.2 短码编码
用 62 进制(0-9, a-z, A-Z)编码,6 位短码可表示:
[ 62^6 = 56,800,235,584 \approx 568 亿 ]
足够覆盖绝大多数场景。
2.3 冲突处理
哈希必然存在冲突,解决方案:
| 方案 | 说明 |
|---|---|
| 拼接时间戳再哈希 | 同一 URL 不同时间生成不同短码 |
| 冲突检测+重试 | 查库判重,冲突则换哈希种子 |
| 拼接随机数 | URL + random → 哈希 |