php语言

如何使用PHP生成唯一ID之SnowFlake

时间:2024-10-22 09:27:26 php语言 我要投稿
  • 相关推荐

如何使用PHP生成唯一ID之SnowFlake

  导语:最近需要做一套CMS系统,由于功能比较单一,而且要求灵活,所以放弃了WP这样的成熟系统,自己做一套相对简单一点的。下面就由小编为大家介绍一下如何使用PHP生成唯一ID之SnowFlake,欢迎大家阅读!

  考虑过的方法有

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

  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源码

  namespace AppServices;

  abstract class Particle {

  const EPOCH = 1479533469598;

  const max12bit = 4095;

  const max41bit = 1099511627775;

  static $machineId = null;

  public static function machineId($mId = 0) {

  self::$machineId = $mId;

  }

  public static function generateParticle() {

  /*

  * Time - 42 bits

  */

  $time = floor(microtime(true) * 1000);

  /*

  * Substract custom epoch from current time

  */

  $time -= self::EPOCH;

  /*

  * Create a base and add time to it

  */

  $base = decbin(self::max41bit + $time);

  /*

  * Configured machine id - 10 bits - up to 1024 machines

  */

  if(!self::$machineId) {

  $machineid = self::$machineId;

  } else {

  $machineid = str_pad(decbin(self::$machineId), 10, "0", STR_PAD_LEFT);

  }

  /*

  * sequence number - 12 bits - up to 4096 random numbers per machine

  */

  $random = str_pad(decbin(mt_rand(0, self::max12bit)), 12, "0", STR_PAD_LEFT);

  /*

  * Pack

  */

  $base = $base.$machineid.$random;

  /*

  * Return unique time id no

  */

  return bindec($base);

  }

  public static function timeFromParticle($particle) {

  /*

  * Return time

  */

  return bindec(substr(decbin($particle),0,41)) - self::max41bit + self::EPOCH;

  }

  }

  ?>

  调用方法如下

  Particle::generateParticle($machineId);//生成ID

  Particle::timeFromParticle($particle);//反向计算时间戳

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

【如何使用PHP生成唯一ID之SnowFlake】相关文章:

php如何生成随机密码07-01

如何给php生成随机密码09-09

教你如何使用php的session07-13

PHP中使用smarty生成静态文件的实例10-25

使用PHP批量生成随机用户名10-17

如何生成静态页面的PHP类09-15

如何使用php操作redis队列实例09-15

如何使用PHP计算时间差07-20

PHP如何使用curl实现数据抓取09-27

如何使用PHP开发高效的web系统10-19

文章
代写

文章代写服务

网站编辑 · 帮您写文章

品质保证、原创高效、量身定制满足您的需求

点击体验
ai帮你写文章
一键生成 高质量 不重复
微信扫码,即可体验

如何使用PHP生成唯一ID之SnowFlake

  导语:最近需要做一套CMS系统,由于功能比较单一,而且要求灵活,所以放弃了WP这样的成熟系统,自己做一套相对简单一点的。下面就由小编为大家介绍一下如何使用PHP生成唯一ID之SnowFlake,欢迎大家阅读!

  考虑过的方法有

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

  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源码

  namespace AppServices;

  abstract class Particle {

  const EPOCH = 1479533469598;

  const max12bit = 4095;

  const max41bit = 1099511627775;

  static $machineId = null;

  public static function machineId($mId = 0) {

  self::$machineId = $mId;

  }

  public static function generateParticle() {

  /*

  * Time - 42 bits

  */

  $time = floor(microtime(true) * 1000);

  /*

  * Substract custom epoch from current time

  */

  $time -= self::EPOCH;

  /*

  * Create a base and add time to it

  */

  $base = decbin(self::max41bit + $time);

  /*

  * Configured machine id - 10 bits - up to 1024 machines

  */

  if(!self::$machineId) {

  $machineid = self::$machineId;

  } else {

  $machineid = str_pad(decbin(self::$machineId), 10, "0", STR_PAD_LEFT);

  }

  /*

  * sequence number - 12 bits - up to 4096 random numbers per machine

  */

  $random = str_pad(decbin(mt_rand(0, self::max12bit)), 12, "0", STR_PAD_LEFT);

  /*

  * Pack

  */

  $base = $base.$machineid.$random;

  /*

  * Return unique time id no

  */

  return bindec($base);

  }

  public static function timeFromParticle($particle) {

  /*

  * Return time

  */

  return bindec(substr(decbin($particle),0,41)) - self::max41bit + self::EPOCH;

  }

  }

  ?>

  调用方法如下

  Particle::generateParticle($machineId);//生成ID

  Particle::timeFromParticle($particle);//反向计算时间戳

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

【如何使用PHP生成唯一ID之SnowFlake】相关文章:

php如何生成随机密码07-01

如何给php生成随机密码09-09

教你如何使用php的session07-13

PHP中使用smarty生成静态文件的实例10-25

使用PHP批量生成随机用户名10-17

如何生成静态页面的PHP类09-15

如何使用php操作redis队列实例09-15

如何使用PHP计算时间差07-20

PHP如何使用curl实现数据抓取09-27

如何使用PHP开发高效的web系统10-19