资讯专栏INFORMATION COLUMN

PHP使用SnowFlake算法生成唯一ID

Blackjun / 1492人阅读

摘要:使用算法生成唯一前言最近需要做一套系统,由于功能比较单一,而且要求灵活,所以放弃了这样的成熟系统,自己做一套相对简单一点的。默认情况下的时间戳可以支持该算法使用到年,的工作机器可以支持台机器,序列号支持毫秒产生个自增序列。

使用SnowFlake算法生成唯一ID

前言:最近需要做一套CMS系统,由于功能比较单一,而且要求灵活,所以放弃了WP这样的成熟系统,自己做一套相对简单一点的。文章的详情页URL想要做成url伪静态的格式即xxx.html 其中xxx考虑过直接用自增主键,但是感觉这样有点暴露文章数量,有同学说可以把初始值设高一点,可是还是可以通过ID差算出一段时间内的文章数量,所以需要一种可以生成唯一ID的算法。

考虑过的方法有

直接用时间戳,或者以此衍生的一系列方法

Mysql自带的uuid

以上两种方法都可以查到就不多做解释了

最终选择了Twitter的SnowFlake算法

这个算法的好处很简单可以在每秒产生约400W个不同的16位数字ID(10进制)

原理很简单

ID由64bit组成

其中 第一个bit空缺

41bit用于存放毫秒级时间戳

10bit用于存放机器id

12bit用于存放自增ID

除了最高位bit标记为不可用以外,其余三组bit占位均可浮动,看具体的业务需求而定。默认情况下41bit的时间戳可以支持该算法使用到2082年,10bit的工作机器id可以支持1023台机器,序列号支持1毫秒产生4095个自增序列id。

下面是PHP源码



调用方法如下

Particle::generateParticle($machineId);//生成ID
Particle::timeFromParticle($particle);//反向计算时间戳

这里我做了改良 如果机器ID传0 就会去掉这10bit 因为有些时候我们可能用不到这么多ID

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/22155.html

相关文章

  • PHP实现Snowflake生成分布式唯一ID

    摘要:使用生成很多都是在分布式场景下使用,我看了下网上有其中有几篇实现的都没有考虑到线程安全。现在有了的锁和协程的加持,对于我们开发线程安全和高并发模拟还是很方便的,这里用结合来学习下实现最简单的好久没写,感觉没有真写不了了。 Twitter 的 snowflake 在分布式生成唯一 UUID 应用还是蛮广泛的,基于 snowflake 的一些变种的算法网上也有不少。使用 snowflake...

    luodongseu 评论0 收藏0
  • Snowflake分布式ID生成算法PHP的版本

    摘要:所以就诞生了这个项目,以下为线程安全版本和非线程安全版本差别。非线程安全版本线程安全版本安装示例注意区间在超出范围将会报告一个致命错误协议版权归属于请遵守协议 php_snowflake 项目地址 什么是 php_snowflake? 推特分布式id生成算法SnowFlake PHP 的实现 需求 PHP >= 5.6 (5.5以下的自行测试) 不支持windows 说明 纯PH...

    alphahans 评论0 收藏0
  • php + redis + lua 实现一个简单的发号器(1)-- 原理篇

    摘要:出于以上两个原因,我们需要自己的发号器来产生。与此同时,为了保证执行,具有原子性,我们使用来进行实现。由于能力和水平有限,难免会有纰漏,希望及时指出。参考文章分布式生成器实现上实现原理 1、为什么要实现发号器 很多地方我们都需要一个全局唯一的编号,也就是uuid。举一个常见的场景,电商系统产生订单的时候,需要有一个对应的订单编号。在composer上我们也可以看到有很多可以产生uuid...

    rottengeek 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<