##原理
参考Twitter-Snowflake 算法,扩展了其中的细节。具体组成如下图:
如图所示,64bits 咱们分成了4个部分。
- 毫秒级的时间戳,有42个bit.能够使用139年,从1970年开始计算,能使用到2109年,当然这些是可以扩展的,可以通知指定起始时间来延长这个日期长度。
- 自定义节点id,防止多进程运行产生重复id,占位12个bit,能够支持4096个节点。部署的时候可以配置好服务器id;
进程workerid,占位5bit,能够生成32个进程id。根据pid运算获得。(已经取消)- 进程内毫秒时间自增序号。占位10bit,一毫秒能产生1024个id。也就是说并发1秒能产生1024000个id。
###唯一性保证
100%唯一性保证,根据nodeid的不一样保证多服务器的唯一性,使用共享内存+自旋锁保证单节点多进程的唯一性 同一毫秒内自增变量保证并发的唯一性。
###安装DonkeyID扩展
cd /usr/local/php/include/php/ext sudo git clone https://github.com/osgochina/donkeyid.git cd /usr/local/php/include/php/ext/donkeyid/donkeyid sudo phpize sudo ./configure --with-php-config=/usr/local/php/bin/php-config sudo make && sudo make install
配置
在php.ini 中配置节点id
[DonkeyId] ;0-4095 donkeyid.node_id=0 ;0-当前时间戳 donkeyid.epoch=0
####api接口
- dk_get_next_id()
获取基于Snowflake算法的id
- dk_get_next_ids(num,num,time=0)
获取基于Snowflake算法的id列表.num:生成id的数量,num:生成id的数量,time:需要生成指定时间的id.$time 默认为0 生成当前时间指定数量的id
- dk_parse_id($id)
解析基于Snowflake算法的id元数据,返回值包括:time id生成时间,node_id 节点id,sequence 自增数
- dk_get_ts_id()
获取10进制的时间戳类型的id
- dk_get_ts_ids(num,num,time=0)
获取10进制的时间戳类型的id列表.num:生成id的数量,num:生成id的数量,time:需要生成指定时间的id.$time 默认为0 生成当前时间指定数量的id
- dk_parse_ts_id($tsid)
解析10进制的时间戳类型的id元数据,返回值包括:time id生成时间,node_id 节点id,sequence 自增数
- dk_get_dt_id()
获取字符串类型的id,显式包含日期时间属性