标准答案
- 使用数据库自增或全局唯一 ID,再用 Base62 等编码生成短码,避免直接暴露可猜的敏感业务 ID。
- 短码建立唯一索引,冲突时重试或使用不可预测的随机码并处理竞争。
- 跳转读取可缓存,失效和删除要有策略;点击统计异步记录并允许重复或采样。
题目解析
短链接创建的事实是短码到目标对象的唯一映射,必须由数据库唯一约束裁决并定义覆盖、过期和删除语义。编码算法只负责表示 ID,不自动提供安全性。
跳转路径可以使用缓存降低延迟,但缓存失效或旧值不能让短码指向错误目标。修改和删除要有版本、失效与回源策略,敏感目标不能因为短码可猜就暴露。
点击统计属于旁路事件,不应阻塞跳转主路径。异步统计允许重复、采样或延迟,但要单独说明隐私、反作弊和最终统计语义。
代码示例
Base62 编码应对 0 和负数定义边界:
TypeScript
const alphabet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
function encode(id: bigint) {
if (id === 0n) return alphabet[0]
let result = ""
while (id > 0n) { result = alphabet[Number(id % 62n)] + result; id /= 62n }
return result
}常见误区
- 误区:用随机短码却没有唯一约束。改正:数据库建立唯一索引,冲突时重试或返回明确结果。
- 误区:同步写统计导致跳转被统计服务拖慢。改正:将统计事件异步化,并定义丢失、重复和采样策略。
- 误区:把可猜短码当成访问授权。改正:敏感对象仍需用户和租户权限校验,短码只负责定位。