定制 hejunjie/id-generator 二次开发

按需修改功能、优化性能、对接业务系统,提供一站式技术支持

邮箱:yvsm@zunyunkeji.com | QQ:316430983 | 微信:yvsm316

hejunjie/id-generator

Composer 安装命令:

composer require hejunjie/id-generator

包简介

轻量级 PHP ID 生成器,提供雪花算法、UUID、时间戳和自定义可读 ID 等多种策略,确保全局唯一性与高并发性能,可轻松集成到任何 PHP 项目,适用于订单号、资源标识、日志追踪等多种业务场景 | A lightweight PHP ID generator supporting Snowflake, UUID, timestamp, and custom readable ID strategies. Ensures global uniqueness and high-performance, easily integrable into any PHP project, suita

README 文档

README

English | 简体中文

A lightweight PHP ID generator supporting Snowflake, UUID, timestamp, and readable ID strategies. Suitable for order numbers, database primary keys, log tracing, resource identifiers, and more.

🔗 Quickly understand this project's structure and code logic via Zread.

Features

  • Four built-in strategies: Snowflake, Timestamp, Readable, UUID — covering common ID generation needs
  • Custom strategy support: Implement the Generator interface and register your own strategy
  • Concurrency-safe: Built-in file lock and Redis lock, from single machine to distributed
  • Parseable IDs: Extract timestamp, machine ID, sequence number, and more from generated IDs
  • Lightweight with zero dependencies: Redis extension is optional; only PHP >= 8.1 required

Requirements

  • PHP >= 8.1
  • ext-redis (optional, recommended for distributed scenarios)

Installation

composer require hejunjie/id-generator

Quick Start

use Hejunjie\IdGenerator\IdGenerator;

// Create a Snowflake ID generator
$generator = IdGenerator::make('snowflake');

// Generate an ID
echo $generator->generate(); // 746532984356372480

// Parse an ID
print_r($generator->parse('746532984356372480'));
// [
//     'timestamp'  => 1715779200000,
//     'datetime'   => '2024-05-15 12:00:00',
//     'machine_id' => 256,
//     'sequence'   => 0,
// ]

Built-in Strategies

Snowflake

64-bit Snowflake algorithm: 1-bit sign + 41-bit timestamp + 10-bit machine ID + 12-bit sequence number.

Configuration:

Parameter Type Default Description
useFileLock bool false Enable file lock for concurrency safety
redisConfig array [] Redis config; automatically uses Redis lock when provided

Concurrency modes:

Mode Description Use Case
Default (no lock) Random sequence; duplicates possible at > 75 IDs/ms Low-frequency calls
File lock Safe on a single machine; slightly lower performance Single server
Redis lock Safe across distributed systems (recommended) Distributed

Note

The machine ID is automatically obtained via the MACHINE_ID environment variable, MAC address, or IP address. See Configuration for details.

use Hejunjie\IdGenerator\IdGenerator;

// Default (no lock)
$snowflake = IdGenerator::make('snowflake');

// Redis lock (recommended for distributed)
$snowflake = IdGenerator::make('snowflake', [
    'redisConfig' => [
        'host' => '127.0.0.1',
        'port' => 6379,
        'auth' => null, // omit if no password
    ],
]);

$id = $snowflake->generate();
print_r($snowflake->parse($id));

Timestamp

Millisecond timestamp + sequence number, with optional custom prefix.

Configuration:

Parameter Type Default Description
prefix string '' ID prefix; no prefix added if omitted
useFileLock bool false Enable file lock for concurrency safety
redisConfig array [] Redis config; automatically uses Redis lock when provided
use Hejunjie\IdGenerator\IdGenerator;

// Timestamp ID with prefix
$timestamp = IdGenerator::make('timestamp', ['prefix' => 'ORD']);

$id = $timestamp->generate(); // ORD1715779200000123034
print_r($timestamp->parse($id));
// [
//     'prefix'    => 'ORD',
//     'datetime'  => '2024-05-15 12:00:00',
//     'timestamp' => 1715779200000,
//     'sequence'  => '123034',
// ]

Readable

Human-readable ID in the format PREFIX-YYYY-MM-DD-RANDOM. Ideal for user-facing scenarios.

Configuration:

Parameter Type Default Description
prefix string 'ID' ID prefix, automatically uppercased
randomLength int 8 Random string length (A-Z, 0-9)
use Hejunjie\IdGenerator\IdGenerator;

$readable = IdGenerator::make('readable', ['prefix' => 'ORD', 'randomLength' => 6]);

$id = $readable->generate(); // ORD-2024-05-15-A3B9K2
print_r($readable->parse($id));
// [
//     'prefix' => 'ORD',
//     'date'   => '2024-05-15',
//     'random' => 'A3B9K2',
// ]

UUID

RFC 4122 compliant. Supports both v1 (time-based) and v4 (random).

Configuration:

Parameter Type Default Description
version string 'v4' UUID version: v1 or v4
use Hejunjie\IdGenerator\IdGenerator;

// UUID v4 (default)
$uuid = IdGenerator::make('uuid');

// UUID v1
$uuid = IdGenerator::make('uuid', ['version' => 'v1']);

$id = $uuid->generate(); // 550e8400-e29b-41d4-a716-446655440000
print_r($uuid->parse($id));
// [
//     'uuid'    => '550e8400-e29b-41d4-a716-446655440000',
//     'version' => '4',
// ]

Custom Strategies

Implement the Generator interface, then register with registerStrategy:

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];
    }
}

// Register
IdGenerator::registerStrategy('custom', function (array $config) {
    return new MyCustomGenerator($config['prefix'] ?? 'MY');
});

// Use
$custom = IdGenerator::make('custom', ['prefix' => 'ORD']);
echo $custom->generate(); // ORD-4821

Configuration

Machine ID (Snowflake)

The Snowflake strategy requires a 10-bit machine ID (0–1023). The resolution order is:

  1. Environment variable (recommended): set MACHINE_ID to manually specify the machine ID
  2. MAC address: automatically reads the network interface MAC address and hashes it
  3. IP address: falls back to IP address hashing when the above are unavailable
# Recommended: specify via environment variable at deploy time
export MACHINE_ID=1

Redis Configuration

For distributed scenarios, configure Redis as follows:

[
    'redisConfig' => [
        'host' => '127.0.0.1',
        'port' => 6379,
        'auth' => null, // password; omit if none
    ],
]

FAQ

Which strategy should I choose?

Strategy Use Case Example ID
Snowflake Distributed systems, DB primary keys, timestamp parsing 746532984356372480
Timestamp Order numbers, transaction IDs, prefixed IDs ORD1715779200000123034
Readable User-visible IDs, ticket numbers ORD-2024-05-15-A3B9K2
UUID Standardized scenarios, third-party integrations 550e8400-e29b-41d4-a716-446655440000

Can the default mode (no lock) produce duplicates?

Snowflake's default mode uses a random sequence number, with collision risk when generating more than ~75 IDs per millisecond. This is typically safe for low-frequency use (e.g., a single ID per web request). For high-concurrency scenarios, use the Redis lock.

What happens if Redis is unreachable?

If redisConfig is provided but Redis is unavailable, generate() will throw an exception. Consider implementing error handling or a fallback strategy.

Contributing

Issues and pull requests are welcome — whether it's new strategies, performance improvements, or documentation enhancements.

This project is licensed under the MIT License.

hejunjie/id-generator 适用场景与选型建议

hejunjie/id-generator 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 57 次下载、GitHub Stars 达 2, 最近一次更新时间为 2025 年 08 月 21 日, 在 PHP 生态内属于活跃度较高的组件。

我们在过去多个企业项目中使用过 hejunjie/id-generator 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。

围绕 hejunjie/id-generator 我们能提供哪些服务?
定制开发 / 二次开发

基于 hejunjie/id-generator 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。

BUG 修复 & 性能优化

线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。

项目外包 & 长期维护

承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。

yvsm@zunyunkeji.com QQ:316430983 微信:yvsm316 西安尊云信息科技 · 专注 PHP / Go / 分布式系统研发

统计信息

  • 总下载量: 57
  • 月度下载量: 0
  • 日度下载量: 0
  • 收藏数: 2
  • 点击次数: 27
  • 依赖项目数: 0
  • 推荐数: 0

GitHub 信息

  • Stars: 2
  • Watchers: 0
  • Forks: 0
  • 开发语言: PHP

其他信息

  • 授权协议: MIT
  • 更新时间: 2025-08-21