php语言 百分网手机站

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

时间:2020-09-04 09:24:36 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框架09-15

php学习之php配置09-09

php如何使用fgetcsv读取csv文件出现乱码09-28

如何使用PHP开发自己的MVC框架09-21

php怎么生成随机密码09-29

PHP生成Excel报表的方法09-04

PHP生成树的方法介绍07-15

如何使用gettext来支持PHP的多语言08-28

php学习之php预定义变量09-16