把冗长的网址折叠成一句轻盈的暗号——这是「快缩短网址」(suo.run)每天在做的事。
当一条微博被 140 字限制勒住喉咙,suo.run 悄悄递上一把剪刀,让链接瘦身,让文字呼吸。
一、极简外壳,复杂心脏
用户只看到:
长链 → suo.run/xxxxx → 原站。
幕后却是一场精密的接力:浏览器先吻短链,suo.run 再将其送回长链,最终抵达目的地。
今天我们只聊前半程——如何把一条臃肿的 URL 压缩成五六个字符的琥珀。
二、MurmurHash:轻盈的锻刀
不必动用 MD5、SHA 这类重锤,MurmurHash 已足够锋利。
它一次锻打,32 bit 火花四溅;把火花从 10 进制译成 62 进制(0-9、a-z、A-Z),体积瞬间缩水。
示例:
原链:https://github.com/…
32 bit 哈希:181338494
62 进制:cgSqq
最终短链:suo.run/cgSqq
三、冲突,优雅地拆弹
哈希世界没有绝对安全,只有概率游戏。
策略:
1. 建表存储短链→长链映射。
2. 写入前不加查询,直接 INSERT;若唯一索引抛出 Duplicate Entry,则判定冲突。
3. 冲突时,在长链尾部缀一串盐(如 “#1”),再次哈希;屡撞屡加盐,直至成功。
4. 读取时若发现盐,剥去后再 302 跳转。
一次网络往返即可写库,冲突概率随盐递增指数级下降。

四、性能:让索引替 CPU 奔跑
短链字段建唯一 B+ 树索引,冲突检测交给 InnoDB。
写操作九成一次性成功,省去一次 SELECT;平均延迟 < 5 ms。
若流量洪峰来临,可加一层 Redis 缓存:短链 → 长链常驻内存,回源异步落盘。
五、彩蛋:不止于短
suo.run 还为每条短链附上实时统计:点击次数、地域分布、设备画像。
让每一次跳转,都留下一束可回溯的光。
把世界折叠进口袋,从 suo.run 开始。
