Stories

Detail Return Return

訂單號老是撞車?我寫了個通用 PHP ID 生成器 - Stories Detail

在日常開發裏,我們經常會遇到這種情況:

  • 需要給訂單生成唯一編號;
  • 想給日誌或者資源加個標識;
  • 或者需要一個不會重複的 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

user avatar zhouzhenchao Avatar journey_64224c9377fd5 Avatar kubeexplorer Avatar yian Avatar aipaobudehoutao Avatar coulthard Avatar xiaolanbenlan Avatar gangyidesongshu Avatar
Favorites 8 users favorite the story!
Favorites

Add a new Comments

Some HTML is okay.