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

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

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

一开始,我也用过 time() 拼接随机数、或者 uniqid()

这些方案在小项目里够用,但一旦放到并发稍微高点的业务里,就会出现各种问题:

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

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


这个工具能做什么?

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

1. Snowflake(雪花算法)

  • 经典的分布式 ID 算法;
  • 生成的 ID 在高并发下也能保持唯一。
php 复制代码
use Hejunjie\IdGenerator\IdGenerator;

$generator = new IdGenerator::make('snowflake')
$id = $generator->generate();

echo $id; // 233953299479035905

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


2. Timestamp(时间戳 ID)

  • 由时间戳+序列号构成;
  • 可以加前缀,比如生成订单号:
php 复制代码
use Hejunjie\IdGenerator\IdGenerator;

$generator = new IdGenerator::make('timestamp', ['prefix' => 'ORD']);
$id = $generator->generate();

echo $id; // ORD1755778813238294503

3. Readable(可读 ID)

  • 格式类似:ORD-20250822-abcdef12
  • 适合展示给用户,更容易记忆。
php 复制代码
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;
  • 通用,跨系统时尤其常见。
php 复制代码
use Hejunjie\IdGenerator\IdGenerator;

$generator = new IdGenerator::make('uuid', ['version' => 'v4']);
$id = $generator->generate();

echo $id; // ad0f5dfc-4a3d-4c2a-853b-aa3a3d9062aa

5. 自定义策略

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

php 复制代码
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

为什么要做这个库?

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

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

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


安装方式

bash 复制代码
composer require hejunjie/id-generator

最后

这个小工具库目前还是 v1.0.0,功能比较基础。

如果你在项目里也有类似需求,可以拿来试试看。

要是你有更好的想法(比如加 ULID、新的生成算法等),非常欢迎提 PR 或者 Issue,一起完善。

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

相关推荐
两个人的幸福2 天前
Windows 桌面应用自研 PHP 队列(下):完整代码与六大工程化优化
php
BingoGo5 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
JaguarJack5 天前
PHP 泛型之殇 泛型 RFC 提案被拒绝
后端·php
用户3074596982075 天前
PHP 扩展——从入门到理解
php
鹏仔先生6 天前
拷贝漫画APP下载页PHP程序,后台带免费AI写作
php
云水一下6 天前
从零开始学 PHP 系列(一):PHP 的前世今生与开发环境搭建
开发语言·php
xingpanvip6 天前
星盘接口开发文档:本命盘接口指南
android·开发语言·css·php·lua
酉鬼女又兒6 天前
零基础入门计算机网络运输层:端到端通信核心作用、端口号分类规则、复用分用工作机制及UDP与TCP协议全方位对比详解
网络·网络协议·tcp/ip·计算机网络·考研·udp·php
dog2506 天前
不要再继续优化 TCP
网络协议·tcp/ip·php
Channing Lewis7 天前
PHP 解析 Excel 的那些坑:一次“行号错位”引发的数据丢失
开发语言·php·excel