Donkeyid 正在参加 2021 年度 OSC 中国开源项目评选,请投票支持!
Donkeyid 在 2021 年度 OSC 中国开源项目评选 中已获得 {{ projectVoteCount }} 票,请投票支持!
2021 年度 OSC 中国开源项目评选 正在火热进行中,快来投票支持你喜欢的开源项目!
2021 年度 OSC 中国开源项目评选 >>> 中场回顾
Donkeyid 获得 2021 年度 OSC 中国开源项目评选「最佳人气项目」 !
授权协议 GPL
开发语言 C/C++
操作系统 跨平台
软件类型 开源软件
所属分类 程序开发
开源组织
地区 国产
投 递 者 ClownFish
适用人群 未知
收录时间 2016-04-13

软件简介

 

DonkeyID---php扩展-64位自增ID生成器

0.7版本请访问

原理

参考Twitter-Snowflake 算法,扩展了其中的细节。具体组成如下图:

bits.jpg

如图所示,64bits 咱们分成了4个部分。

  1. 毫秒级的时间戳,有42个bit.能够使用139年,从1970年开始计算,能使用到2109年,当然这些是可以扩展的,可以通知指定起始时间来延长这个日期长度。
  2. 自定义节点id,防止多进程运行产生重复id,占位12个bit,能够支持4096个节点。部署的时候可以配置好服务器id;
  3. 进程workerid,占位5bit,能够生成32个进程id。根据pid运算获得。(已经取消)
  4. 进程内毫秒时间自增序号。占位10bit,一毫秒能产生1024个id。也就是说并发1秒能产生1024000个id。

唯一性保证

100%唯一性保证,根据nodeid的不一样保证多服务器的唯一性,使用共享内存+自旋锁保证单节点多进程的唯一性 同一毫秒内自增变量保证并发的唯一性。

使用

安装

下载代码到本地,进入项目文件夹,执行

cd ./donkeyid
/path/to/phpize
./configure --with-php-config=/path/to/php-config
make
make install
echo "extension=donkeyid.so" >> /path/to/php.ini

模式介绍

DonkeyId 有三种id生成模式:

  1. 默认模式,以上的介绍都是基于默认模式, dk_get_next_id()。
  2. 第二种模式是10进制模式 生成最多20位数字.从右开始算第十位以后的数字是时间戳的秒, 第7位到第9位 是节点id。三位数字,最多到999.从第2位到第6位是秒内的自增id, 最后一位是留给业务方的自定义位数。2016053010150316300120001.dk_get_ts_id().
  3. 第三种模式是字符串模式,生成一个25位的字符串,前17位是年月日时分秒毫秒,第18位到21位是节点id,第22-25位是毫秒内自增id。dk_get_dt_id().

运行

配置

在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($time,$num)

获取基于Snowflake算法的id列表.$time:需要生成指定时间的id,$num:生成id的数量

  • dk_parse_id($id)

解析基于Snowflake算法的id元数据,返回值包括:time id生成时间,node_id 节点id,sequence 自增数

  • dk_get_ts_id()

获取10进制的时间戳类型的id

  • dk_get_ts_ids($time,$num)

获取10进制的时间戳类型的id列表,$time:需要生成指定时间的id,$num:生成id的数量

  • dk_parse_ts_id($tsid)

解析10进制的时间戳类型的id元数据,返回值包括:time id生成时间,node_id 节点id,sequence 自增数

  • dk_get_dt_id()

获取字符串类型的id,显式包含日期时间属性

测试代码

  $nextid = dk_get_next_id();  echo "nextid:".$nextid."\n";  print_r(dk_parse_id($nextid));   $tsid = dk_get_ts_id();  echo "tsid:".$tsid."\n";  print_r(dk_parse_ts_id($tsid));   $dtid = dk_get_dt_id();  echo "dtid:".$dtid."\n";   echo "nextids:\n";  print_r(dk_get_next_ids(1470298401,100));   echo "tsids:\n";  print_r(dk_get_ts_ids(1470298401,100)); 

支持版本

支持 php5.3+ ,支持php 7-7.4

展开阅读全文

代码

的 Gitee 指数为
超过 的项目

评论

点击引领话题📣
发表于开发技能专区
2020/11/13 18:39

DonkeyID-64 位自增 ID 生成器发布 1.1.1 版本,支持 php8!

DonekyId-1.1.1版本发布,该版本支持php8.0! 更新记录如下: 支持php8.0! 修复了编译时警告。 修复了一些兼容性问题。 该版本从php5.3支持到php8.0. 关于DonkeyID donkeyid是一个用于生成唯一id的php扩展。使用snowflake算法实现。并且支持多种id类型。 DonkeyId 有三种id生成模式: 默认模式,以上的介绍都是基于默认模式,(mysql字段请使用bigint(20)). dk_get_next_id()。 第二种模式是10进制模式 生成最多20位数字,(mysql字...

7
7
发表了资讯
2020/04/09 10:19

Donkeyid v1.1 发布,64 位自增 ID 生成器

本次更新如下: php7.4 的支持。 移除 http 服务,更加专注于扩展 支持动态修改 nodeid。 修复一些编译警告。 Donkeyid 简介 Donkeyid 是参考 Twiteer Snowflake 算法实现的 64 位自增 ID 生成器。支持 php5.3+,php7+。 通过设置 nodeid,通过算法保证生成的 id 全局唯一,实现简单高效的 id 生成。很方便的应用到各种需要 id 唯一性的业务场景。...

2
9
发表了资讯
2016/08/15 00:00

DonkeyID 1.0 发布,PHP 扩展-64 位自增 ID 生成器

DonkeyID,PHP扩展-64位自增ID生成器 DonkeyId 有三种 id 生成模式: 默认模式,以上的介绍都是基于默认模式,dk_get_next_id()。 第二种模式是10进制模式生成最多20位数字。从右开始算第十位以后的数字是时间戳的秒, 第7位到第9位是节点id。三位数字,最多到999。从第2位到第6位是秒内的自增id,最后一位是留给业务方的自定义位数。2016053010150316300120001.dk_get_ts_id(). 第三种模式是字符串模式,生成一个25位的字符串,...

7
22
没有更多内容
加载失败,请刷新页面
点击加载更多
加载中
下一页
发表了博客
{{o.pubDate | formatDate}}

{{formatAllHtml(o.title)}}

{{parseInt(o.replyCount) | bigNumberTransform}}
{{parseInt(o.viewCount) | bigNumberTransform}}
没有更多内容
暂无内容
发表了问答
{{o.pubDate | formatDate}}

{{formatAllHtml(o.title)}}

{{parseInt(o.replyCount) | bigNumberTransform}}
{{parseInt(o.viewCount) | bigNumberTransform}}
没有更多内容
暂无内容
暂无内容
0 评论
30 收藏
分享
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部