URL短链接生成方案对比:随机生成 vs 预生成 vs Hashids 编码

风芳同学_3364

风芳同学_3364

2026-10-29

416人浏览

原创

URL短链接生成方案对比:随机生成 vs 预生成 vs Hashids 编码

本文深入分析url短链服务中短字符串生成的三种主流策略——随机重试、预生成池与hashids编码,结合性能、安全性、可扩展性与实现复杂度,给出面向生产环境的选型建议。

本文深入分析url短链服务中短字符串生成的三种主流策略——随机重试、预生成池与hashids编码,结合性能、安全性、可扩展性与实现复杂度,给出面向生产环境的选型建议。

在构建高性能URL短链服务时,短标识符(shortlink)的设计是核心环节:它需满足唯一性、简洁性、URL友好性(仅含a–z, A–Z, 0–9)及抗枚举性。常见方案看似简单,实则在高并发、数据规模增长与安全边界间存在显著权衡。以下从实践角度展开分析。

? 方案一:纯随机生成 + 冲突重试(不推荐)

该方式每次生成如 rand(3) 的随机字符串(如 "x7m"),查询数据库确认未被占用,若冲突则循环重试。
问题突出:

  • 性能雪崩风险:当3位字符串(62³ = 238,328 种组合,非原文46,656;注:原文误将字符集计为36=26+10,实际大小写敏感应为62)占用率达90%时,平均重试次数趋近10次,DB查询陡增;
  • 竞态条件(Race Condition):高并发下多个请求同时生成相同字符串并查得“未占用”,导致唯一索引冲突(INSERT IGNORE 或 ON DUPLICATE KEY 可缓解但无法根除);
  • 长度升级逻辑脆弱:依赖定时统计或阈值触发升位(如从3→4位),需额外维护状态,且手动干预易出错。
// 示例:危险的随机重试(Laravel伪代码)
do {
    $code = Str::random(3)->lower(); // 简化示意,实际需62进制
} while (ShortLink::where('code', $code)->exists());
ShortLink::create(['code' => $code, 'url' => $originalUrl]);

⚠️ 注意:此方案在QPS > 100的场景下极易成为性能瓶颈,且随数据增长呈指数级恶化。

? 方案二:预生成ID池(可行,但有隐患)

预先生成全部3位、4位等组合(如 "aaa", "aab", … "999"),存入 short_strings 表并标记 is_available=1,使用时原子性 SELECT ... FOR UPDATE 获取并置为 0。
优势:

  • 零重试、低延迟,插入仅需1次DB操作;
  • 长度可控,可按需批量预热(如剩余1000个3位码时自动播种4位码)。

致命缺陷:

  • 可预测性与枚举风险:用户可通过遍历 https://s.co/aaa → https://s.co/aab 轻松爬取全量短链,泄露业务数据或引发滥用;
  • 存储冗余:62⁴ = 14.7M 条4位码即占约1GB表空间(含索引),管理成本高;
  • 冷启动延迟:首次部署需耗时生成数百万记录。

✅ 推荐方案:Hashids 编码(平衡之选)

采用 Hashids —— 一种确定性、可逆、加盐的整数编码算法,将自增主键(如 id=123456)转换为语义无关、无重复、避讳词的短字符串(如 "NkKv")。

核心优势:
| 维度 | 说明 | |--------------|----------------------------------------------------------------------| | 唯一性 | 基于盐值(salt)和输入ID双重哈希,全局唯一,无需查库去重 | | 安全性 | 未知salt无法反推ID,有效抵御ID枚举;输出不含敏感序列或常见单词 | | 性能极致 | 仅1次DB操作:先插入获取自增ID → 立即编码 → 返回短链(无循环/锁) | | 可扩展性 | 支持任意长度(默认8位即可覆盖3000亿ID),平滑扩容无需改逻辑 |

Laravel 实现示例:

composer require hashids/hashids
use Hashids\Hashids;

$hashids = new Hashids('your-app-salt-here-keep-it-secret', 8); // 最小长度8
$id = ShortLink::insertGetId(['url' => $originalUrl]); // 获取新ID
$code = $hashids->encode($id); // 如:'aB3xK9mR'

return response()->json(['short_url' => "https://s.co/{$code}"]);

? 提示:若必须支持(如3–6位),可结合「预生成池」+「Hashids分段映射」,但需严格评估枚举风险。多数成熟服务(如Bitly)均采用类似Hashids的编码方案,兼顾安全与效率。

总结:技术选型决策树

  • ✅ 首选 Hashids:适用于95%场景,尤其重视安全、性能与维护性的生产系统;
  • ⚠️ 慎用预生成池:仅当业务明确允许枚举(如内部测试链接),且能接受存储开销;
  • ❌ 避免纯随机重试:除非流量极低(日UV

最终,短链的本质不是“最短”,而是“在安全、性能、可运维性约束下的最优解”。以Hashids为基座,辅以合理的缓存(如Redis预存热门ID编码)与监控(短码耗尽预警),方能构建稳健可扩展的短链服务。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2023.09.01

11704

6

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

6741

5

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

2023.10.11

2175

5

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

2023.10.23

4268

4

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

2023.10.23

4994

6

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.03

3911

9

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.09

5657

8

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.13

4422

8

sprintf函数用法详解
sprintf函数用法详解

sprintf函数的用法:1、格式化字符串;2、指定输出宽度和精度;3、返回值。更多关于sprintf函数用法详解的内容,大家可以阅读下面的文章。

2023.11.27

12342

4

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习