当前位置: 首页 > news >正文

订单号老是撞车?我写了个通用 PHP ID 生成器

在日常开发里,我们经常会遇到这种情况:

  • 需要给订单生成唯一编号;
  • 想给日志或者资源加个标识;
  • 或者需要一个不会重复的 ID,用作数据库主键。

一开始,我也用过 time() 拼接随机数、或者 uniqid()
这些方案在小项目里够用,但一旦放到并发稍微高点的业务里,就会出现各种问题:

  • time() 很容易撞车(同一毫秒可能生成多个);
  • uniqid() 看上去独特,其实也可能重复,而且格式不太好看;
  • 有些场景希望 ID 可读,比如订单号,最好一眼能分辨。

久而久之,我在不同项目里反复造轮子,干脆就写了一个通用的小工具,把常见的 ID 生成方式都封装起来了。


这个工具能做什么?

它支持几种常见的生成策略:

1. Snowflake(雪花算法)

  • 经典的分布式 ID 算法;
  • 生成的 ID 在高并发下也能保持唯一。
use Hejunjie\IdGenerator\IdGenerator;$generator = new IdGenerator::make('snowflake')
$id = $generator->generate();echo $id; // 233953299479035905

还能解析出来生成时间、机器 ID 等信息,排查问题时很方便。


2. Timestamp(时间戳 ID)

  • 由时间戳+序列号构成;
  • 可以加前缀,比如生成订单号:
use Hejunjie\IdGenerator\IdGenerator;$generator = new IdGenerator::make('timestamp', ['prefix' => 'ORD']);
$id = $generator->generate();echo $id; // ORD1755778813238294503

3. Readable(可读 ID)

  • 格式类似:ORD-20250822-abcdef12
  • 适合展示给用户,更容易记忆。
use Hejunjie\IdGenerator\IdGenerator;$generator = new IdGenerator::make('readable', ['prefix' => 'ORD', 'randomLength' => 6]);
$id = $generator->generate();echo $id; // ORD-2025-08-21-7ABP01

4. UUID

  • 熟悉的 UUID v1/v4;
  • 通用,跨系统时尤其常见。
use Hejunjie\IdGenerator\IdGenerator;$generator = new IdGenerator::make('uuid', ['version' => 'v4']);
$id = $generator->generate();echo $id; // ad0f5dfc-4a3d-4c2a-853b-aa3a3d9062aa

5. 自定义策略

如果你想要特别的格式,比如 USER-随机数,也能自己实现。

use Hejunjie\IdGenerator\Contracts\Generator;
use Hejunjie\IdGenerator\IdGenerator;class MyCustomGenerator implements Generator
{public function __construct(private string $prefix = 'MY') {}public function generate(): string{return $this->prefix . '-' . random_int(1000, 9999);}public function parse(string $id): array{return ['id' => $id];}
}IdGenerator::registerStrategy('custom', function (array $config) {return new MyCustomGenerator($config['prefix'] ?? 'MY');
});$generator = new IdGenerator::make('custom', ['prefix' => 'ORD']);
$id = $generator->generate();echo $id; // ORD-4128

为什么要做这个库?

没有什么“高大上”的理由,就是因为自己项目里老是遇到这种需求:

  • 想要一个统一的生成方式,避免东拼西凑;
  • 想要可扩展,方便以后加新的策略;
  • 想要轻量,直接安装就能用,不依赖庞大的框架。

于是就写了这么个东西,后来觉得或许对别人也有用,就开源了。


安装方式

composer require hejunjie/id-generator

最后

这个小工具库目前还是 v1.0.0,功能比较基础。
如果你在项目里也有类似需求,可以拿来试试看。
要是你有更好的想法(比如加 ULID、新的生成算法等),非常欢迎提 PR 或者 Issue,一起完善。

项目地址 👉 zxc7563598/php-id-generator

http://www.dtcms.com/a/347556.html

相关文章:

  • linux添加新硬盘挂载分区和数据迁移
  • 云计算之云主机Linux是什么?有何配置?如何选?
  • Agent原理、构建模式(附视频链接)
  • Python打卡Day50 预训练模型+CBAM模块
  • 【Camera驱动】GMS测试项中Camera FOV Calibration问题详解
  • ROS机器人运动控制
  • 布偶猫吃什么猫粮比较好?2025猫粮品牌排名
  • 如何创建自己的 Minecraft 世界
  • 8月23号打卡
  • MySql知识梳理之DML语句
  • FL Studio Win版.exe安装教程(直接安装版/详细步骤/附安装包下载)
  • 基于STM32的病房监测系统/环境监测系统/人体健康监测系统
  • 曲面方程的三维可视化:从数学解析到Python实现
  • 分割等和子集
  • React学习(十)
  • 【LeetCode】85. 最大矩形 (暴力枚举)
  • 某铝业智慧工厂网络建设优化方案实践
  • 使用tensorRT10部署yolov5目标检测模型(2)
  • 【深度学习】深度学习中的结构化概率模型:理论、方法与应用
  • Qt从qmake迁移到cmake的记录
  • 【深度学习新浪潮】有哪些工具可以帮助我们对视频进行内容分析和关键信息提取?
  • 从0开始学习Java+AI知识点总结-23.web实战案例(班级和学生增删改查、信息统计)
  • Day58 Java面向对象13 instanceof 和 类型转换
  • 自动化运维Ansible
  • 13.机器学习—— ML特征工程和优化方法
  • CANN安装
  • 电力方向国际期刊推荐
  • 分析 HashMap 源码
  • 《TCP多线程通信代码C语言开发流程解析》
  • redis----hash类型详解