在日常開發裏,我們經常會遇到這種情況:
- 需要給訂單生成唯一編號;
- 想給日誌或者資源加個標識;
- 或者需要一個不會重複的 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