<?php
namespace app\user\controller;
use cmf\controller\AdminBaseController;
class SnowController extends AdminBaseController
{
//开始时间,固定一个小于当前时间的毫秒数即可
const twepoch = 1420041600000;//(2015-01-01),具体可以自己定义
//机器标识占的位数
const workerIdBits = 10;
//毫秒内自增数点的位数
const sequenceBits = 12;
protected $workId = 0;
//要用静态变量
static $lastTimestamp = -1;
static $sequence = 0;
function __construct($workId){
//机器ID范围判断
$maxWorkerId = -1 ^ (-1 << self::workerIdBits);
//echo $maxWorkerId;exit();
if($workId > $maxWorkerId || $workId< 0){ //这里如果用wamp或者phpstudy可能会报错,主要是这里是用的是64位的PHP版本,确保正确即可,在Linux上测试无误
throw new Exception("workerId can't be greater than ".$this->maxWorkerId." or less than 0");
}
//赋值
$this->workId = $workId;
}
//生成一个ID
public function nextId(){
$timestamp = $this->timeGen();
$lastTimestamp = self::$lastTimestamp;
//判断时钟是否正常
if ($timestamp < $lastTimestamp) {
throw new Exception("Clock moved backwards. Refusing to generate id for %d milliseconds", ($lastTimestamp - $timestamp));
}
//生成唯一序列
if ($lastTimestamp == $timestamp) {
$sequenceMask = -1 ^ (-1 << self::sequenceBits);
self::$sequence = (self::$sequence + 1) & $sequenceMask;
if (self::$sequence == 0) {
$timestamp = $this->tilNextMillis($lastTimestamp);
}
} else {
self::$sequence = 0;
}
self::$lastTimestamp = $timestamp;
//
//时间毫秒/数据中心ID/机器ID,要左移的位数
$timestampLeftShift = self::sequenceBits + self::workerIdBits;
$workerIdShift = self::sequenceBits;
//组合3段数据返回: 时间戳.工作机器.序列
$nextId = (($timestamp - self::twepoch) << $timestampLeftShift) | ($this->workId << $workerIdShift) | self::$sequence;
return $nextId;
}
//取当前时间毫秒
protected function timeGen(){
$timestramp = (float)sprintf("%.0f", microtime(true) * 1000);
return $timestramp;
}
//取下一毫秒
protected function tilNextMillis($lastTimestamp) {
$timestamp = $this->timeGen();
while ($timestamp <= $lastTimestamp) {
$timestamp = $this->timeGen();
}
return $timestamp;
}
}
//这里是测试程序,注意,正确生成的话是18位
$snow=new SnowController(1023);
for($i=0; $i<1000;$i++) {
$id = $snow->nextId();
echo $id . "<br>";
}

疯狂份子
- 粉丝: 34
最新资源
- 算法分析与设计样本.doc
- 计算机一级考试总结.docx
- 一个中小企业网络的规划与设计毕业设计==李杨鹏.pdf
- 网络营销实验一实验报告[最终版].pdf
- 网络营销方案升级黄金版.pptx
- 项目管理工程投资如何控制.docx
- 网络升级改造方案第三版.docx
- 下半年信息系统项目管理师下午试卷进度管理监汇总.doc
- 项目管理培训课程(五大过程、九大知识)ppt课件.ppt
- 购销存系统集成应用-.pptx
- 工程项目管理措施.doc
- 算法设计与分析王算法设计基础.pptx
- 网络的力量说课稿.ppt
- 学生复习FlashCS3二维动画制作案例教程电子教案.pptx
- 项目网络营销.pptx
- 市场营销策划已经进入了大数据时代.docx
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈


