/**

* ID 生成策略

* 毫秒级时间41位+机器ID 10位+毫秒内序列12位。

* 0 41 51 64

+-----------+------+------+

|time |pc |inc |

+-----------+------+------+

* 前41bits是以微秒为单位的timestamp。

* 接着10bits是事先配置好的机器ID。

* 最后12bits是累加计数器。

* macheine id(10bits)标明最多只能有1024台机器同时产生ID,sequence number(12bits)也标明1台机器1ms中最多产生4096个ID,

*

* auth: zhouyuan

*/

class idwork

{

const debug = 1;

static $workerId;

static $twepoch = 1361775855078;

static $sequence = 0;

const workerIdBits = 4;

static $maxWorkerId = 15;

const sequenceBits = 10;

static $workerIdShift = 10;

static $timestampLeftShift = 14;

static $sequenceMask = 1023;

private static $lastTimestamp = -1;

function __construct($params){

$workId = $params['workId'];

if($workId > self::$maxWorkerId || $workId< 0 )

{

throw new Exception("worker Id can't be greater than 15 or less than 0");

}

self::$workerId=$workId;

}

function timeGen(){

//获得当前时间戳

$time = explode(' ', microtime());

$time2= substr($time[0], 2, 3);

return $time[1].$time2;

}

function tilNextMillis($lastTimestamp) {

$timestamp = $this->timeGen();

while ($timestamp <= $lastTimestamp) {

$timestamp = $this->timeGen();

}

return $timestamp;

}

function nextId()

{

$timestamp=$this->timeGen();

if(self::$lastTimestamp == $timestamp) {

self::$sequence = (self::$sequence + 1) & self::$sequenceMask;

if (self::$sequence == 0) {

$timestamp = $this->tilNextMillis(self::$lastTimestamp);

}

} else {

self::$sequence = 0;

}

if ($timestamp < self::$lastTimestamp) {

throw new Excwption("Clock moved backwards. Refusing to generate id for ".(self::$lastTimestamp-$timestamp)." milliseconds");

}

self::$lastTimestamp = $timestamp;

$nextId = ((sprintf('%.0f', $timestamp) - sprintf('%.0f', self::$twepoch) )<< self::$timestampLeftShift ) | ( self::$workerId << self::$workerIdShift ) | self::$sequence;

return $nextId;

}

}

?>

一键复制

编辑

Web IDE

原始数据

按行查看

历史

php idwork,idwork.php相关推荐

  1. java idwork长度_java 字符串id

    Java FutureTask import java.util.ArrayList; import java.util.concurrent.Callable; import java.util.c ...

  2. Java项目:教务管理系统(java+JSP+Spring+SpringBoot+layui+maven)

    源码获取:博客首页 "资源" 里下载! 一.项目简述 功能包括: 三角色教师 管理员,学生教务管理系统,包括院系管理,课题综合管理,信息管理,以及差旅管理,学生选题等等. 二.项目 ...

  3. Java项目:教材管理系统(java+SSM+jsp+mysql+maven)

    源码获取:博客首页 "资源" 里下载! 一.项目简述 功能包括: 管理员可以增删改查教材.教材商.入库教材.用户(用 户包括学生和教师)可以对教材商.教材进行.xcel的导入 导出 ...

  4. spring -- 自定义注解

    我们直接通过代码解释自定义注解的使用及各个含义 package com.sysware.cloud.dts.annotation;import java.lang.annotation.*; @Ret ...

  5. Spring Boot+Gradle+ MyBatisPlus3.x搭建企业级的后台分离框架

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 作者:任务加油站 原文:toutiao.com/i6861 ...

  6. Twitter的分布式自增ID算法Snowflake实现分析及其Java、Php和Python版

    在分布式系统中,需要生成全局UID的场合还是比较多的,twitter的snowflake解决了这种需求,实现也还是很简单的,除去配置信息,核心代码就是毫秒级时间41位+机器ID 10位+毫秒内序列12 ...

  7. gradle官方文档_Spring Boot+Gradle+MyBatisPlus3.x搭建企业级的后台分离框架

    你再主动一点点   我们就有故事了 原文:toutiao.com/i6861456496740270604 1.技术选型 解析器:FastJSON 开发工具:JDK1.8 .Gradle.IDEA 技 ...

  8. 分布式系统生成唯一主键

    原创文章,转载请注明出处:服务器非业余研究http://blog.csdn.net/erlib 作者Sunface 唯一ID在系统小的时候,随便整都可以,但是系统大了后呢?这个时候如果出现了问题,ID ...

  9. Golang工具集-String工具,时间工具,http工具等

    gotool gotool是一个小而全的Golang工具集,主要是将日常开发中常用的到方法进行提炼集成,避免重复造轮子,提高工作效率,每一个方法都是作者经过工作经验,和从以往的项目中提炼出来的. 20 ...

最新文章

  1. java url json字符串_使用HttpClient将URL中的JSON查询字符串发送到Web服务(Java)
  2. Ubuntu Server如何配置SFTP
  3. 你真的清楚DateTime in C#吗?
  4. 如何把密度函数化为标准正态二维分布_概率微课:第三章(22) 二维随机变量及分布函数定义...
  5. Youki的装机日记~
  6. 如何安装配置CKEditor 3.0
  7. 隐马尔可夫模型HMM与维特比Veterbi算法(一)
  8. cnapckSurround c++builder Region 代码折叠快捷键
  9. easyui图标对照
  10. 佳博网口打印机驱动安装
  11. Android 运行程序报错:Unable to execute dex: Multiple dex files define Lcom/baidu/android/pushservice/Push
  12. python机器学习实战 getA()函数详解
  13. Spring中的AOP以及切入点表达式和各种通知
  14. OSGearth学习(一)
  15. 浙江大华2022届秋招 内推码306823
  16. 英语期刊写作-通往国际学术舞台的阶梯第七章答案
  17. easyrecovery使用教程,easyrecovery使用方法
  18. 怎么用python读.dat文件
  19. 专访|威威玮炜蜜汁同框的背后,看ofo小黄车的野心与坚持
  20. spring Enviroment

热门文章

  1. 文本挖掘(part6)--共现矩阵
  2. 文献记录(part65)--基于用户聚类的异构社交网络推荐算法
  3. 文献记录(part20)--Discriminative metric learning for multi-view graph partitioning
  4. sklearn自学指南(part34)--K-means
  5. 文献记录(part14)--Biclustering with dominant sets
  6. 图示机器学习(part1)--机器学习与应用
  7. JavaScript入门(part3)--变量
  8. R语言观察日志(part1)--subset函数
  9. 《弗洛伊德及其后继者》读书笔记(part1)--西格蒙德·弗洛伊德与经典精神分析传统
  10. 向seaborn传递matplotlib绘图参数,精细地控制seaborn输出图形