{"id":19001727,"url":"https://github.com/ledccn/snowflake","last_synced_at":"2026-06-20T03:31:43.593Z","repository":{"id":214853182,"uuid":"737521385","full_name":"ledccn/snowflake","owner":"ledccn","description":"雪花算法的PHP实现","archived":false,"fork":false,"pushed_at":"2023-12-31T11:13:37.000Z","size":10,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-21T13:31:52.897Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ledccn.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2023-12-31T11:12:07.000Z","updated_at":"2023-12-31T11:13:03.000Z","dependencies_parsed_at":null,"dependency_job_id":"6974d1ae-0447-4653-9224-ded3ac51004a","html_url":"https://github.com/ledccn/snowflake","commit_stats":null,"previous_names":["ledccn/snowflake"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/ledccn/snowflake","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ledccn%2Fsnowflake","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ledccn%2Fsnowflake/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ledccn%2Fsnowflake/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ledccn%2Fsnowflake/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ledccn","download_url":"https://codeload.github.com/ledccn/snowflake/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ledccn%2Fsnowflake/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34556494,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-20T02:00:06.407Z","response_time":98,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-08T18:12:29.972Z","updated_at":"2026-06-20T03:31:43.572Z","avatar_url":"https://github.com/ledccn.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv\u003e\n  \u003cp align=\"center\"\u003e\n    \u003cimage src=\"https://www.pngkey.com/png/full/105-1052235_snowflake-png-transparent-background-snowflake-with-clear-background.png\" width=\"250\" height=\"250\"\u003e\u003c/image\u003e\n  \u003c/p\u003e\n  \u003cp align=\"center\"\u003eAn ID Generator for PHP based on Snowflake Algorithm (Twitter announced).\u003c/p\u003e\n\u003c/div\u003e\n\n## 说明\n\n雪花算法的 PHP 实现\n\n![file](https://images.godruoyi.com/comments/201908/13/_1565668072_AbkRnhQaYk.png)\n\nSnowflake 是 Twitter 内部的一个 ID 生算法，可以通过一些简单的规则保证在大规模分布式情况下生成唯一的 ID 号码。其组成为：\n\n* 第一个 bit 为未使用的符号位。\n* 第二部分由 41 位的时间戳（毫秒）构成，他的取值是当前时间相对于某一时间的偏移量。\n* 第三部分和第四部分的 5 个 bit 位表示数据中心和机器ID，其能表示的最大值为 2^5 -1 = 31。\n* 最后部分由 12 个 bit 组成，其表示每个工作节点**每毫秒**生成的序列号 ID，同一毫秒内最多可生成 2^12 -1 即 4095 个 ID。\n\n需要注意的是：\n\n* 在分布式环境中，5 个 bit 位的 datacenter 和 worker 表示最多能部署 31 个数据中心，每个数据中心最多可部署 31 台节点。\n* 41 位的二进制长度最多能表示 2^41 -1 毫秒即 69 年，所以雪花算法最多能正常使用 69 年，为了能最大限度的使用该算法，你应该为其指定一个开始时间。\n\n\u003e 由上可知，雪花算法生成的 ID 并不能保证唯一，如当两个不同请求同一时刻进入相同的数据中心的相同节点时，而此时该节点生成的 sequence 又是相同时，就会导致生成的 ID 重复。\n\n所以要想使用雪花算法生成唯一的 ID，就需要保证同一节点同一毫秒内生成的序列号是唯一的。基于此，我们在 SDK 中集成了多种序列号提供者：\n\n* RandomSequenceResolver（随机生成）\n* RedisSequenceResolver （基于 redis psetex 和 incrby 生成）\n* LaravelSequenceResolver（基于 redis psetex 和 incrby 生成）\n* SwooleSequenceResolver（基于 swoole_lock 锁）\n* FileLockResolver（基于 PHP 文件锁）\n\n\u003e **Warning**\n\u003e RandomSequenceResolver 序列号提供者在高并发情况下可能会导致生成的 ID 重复，如果你的应用场景中可能会出现高并发的情况，建议使用 RedisSequenceResolver 或者 LaravelSequenceResolver。\n\n## 要求\n\n1. PHP \u003e= 8.1\n2. **[Composer](https://getcomposer.org/)**\n\n## 安装\n\n```shell\n$ composer require ledc/snowflake -vvv\n```\n\n## 使用\n\n1. 简单使用.\n\n```php\n$snowflake = new \\Ledc\\Snowflake\\Snowflake;\n\n$snowflake-\u003eid();\n// 1537200202186752\n```\n\n2. 指定数据中心ID及机器ID.\n\n```php\n$snowflake = new \\Ledc\\Snowflake\\Snowflake($datacenterId, $workerId);\n\n$snowflake-\u003eid();\n```\n\n3. 指定开始时间.\n\n```php\n$snowflake = new \\Ledc\\Snowflake\\Snowflake;\n$snowflake-\u003esetStartTimeStamp(strtotime('2019-08-08')*1000);\n\n$snowflake-\u003eid();\n```\n\n4. 使用索尼雪花算法\n\n```php\n$sonyflake = new \\Ledc\\Snowflake\\Sonyflake;\n\n$sonyflake-\u003eid();\n```\n\n## 高级\n\n1. 在 Laravel 中使用\n\n因为 SDK 相对简单，我们并没有提供 Laravel 的扩展包，你可通过下面的方式快速集成到 Laravel 中。\n\n```php\n// App\\Providers\\AppServiceProvider\n\nuse Ledc\\Snowflake\\Snowflake;\nuse Ledc\\Snowflake\\LaravelSequenceResolver;\n\nclass AppServiceProvider extends ServiceProvider\n{\n    /**\n     * Register any application services.\n     *\n     * @return void\n     */\n    public function register()\n    {\n        $this-\u003eapp-\u003esingleton('snowflake', function ($app) {\n            return (new Snowflake())\n                -\u003esetStartTimeStamp(strtotime('2019-10-10')*1000)\n                -\u003esetSequenceResolver(new LaravelSequenceResolver($app-\u003eget('cache.store')));\n        });\n    }\n}\n}\n```\n\n2. 自定义序列号解决器\n\n你可以通过实现 Ledc\\Snowflake\\SequenceResolver 接口来自定义序列号解决器。\n\n```php\nclass YourSequence implements SequenceResolver\n{\n    /**\n     *  {@inheritdoc}\n     */\n    public function sequence(int $currentTime)\n    {\n          // Just test.\n        return mt_rand(0, 1);\n    }\n}\n\n// usage\n\n$snowflake-\u003esetSequenceResolver(new YourSequence);\n$snowflake-\u003eid();\n```\n\n你也可以直接使用闭包：\n\n```php\n$snowflake = new \\Ledc\\Snowflake\\Snowflake;\n$snowflake-\u003esetSequenceResolver(function ($currentTime) {\n    static $lastTime;\n    static $sequence;\n\n    if ($lastTime == $currentTime) {\n        ++$sequence;\n    } else {\n        $sequence = 0;\n    }\n\n    $lastTime = $currentTime;\n\n    return $sequence;\n})-\u003eid();\n```\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fledccn%2Fsnowflake","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fledccn%2Fsnowflake","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fledccn%2Fsnowflake/lists"}