热烈推荐:超多IT资源,尽在798资源网
系统中某些场景少不了全局唯一ID的使用,来保证数据的唯一性。除了通过数据库自带的自增id来保证 id 的唯一性,通常为了保证的数据的可移植性会选择通过程序生成全局唯一 id。
百度了不少php相关的生成方式,得到的大多是随机字符串和内置的 uniqid()函数。不过经过 ab 测试,在并发情况下重复度是很高的。
偶然看到了一篇 Twitter的分布式自增ID算法 snowflake 的文章,得到的全局唯一都是纯数字。这一点对于数据库来说,在此列上创建索引并通过此字段关联查询的时候是比较好的。
需要值得注意的是:
snowflake的结构是64位的,所以需要在64位的PHP上运行。可以通过 phpinfo() 查看PHP的位数。一般 Linux 上的 PHP都可以满足。
下面是相关代码:
<?php
/***
* Author:阿远
* Class SnowflakeIdWorker
*/
class SnowflakeIdWorker{
/** 开始时间截 (2018-01-01) */
const twepoch = 1514736000000;
/** 机器id所占的位数 */
const workerIdBits = 10;
//支持的最大机器id,结果是1023 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数)
const maxW