文档章节

修改自Twitter的Snowflake算法

思_无_邪
 思_无_邪
发布于 2015/10/20 15:51
字数 545
阅读 71
收藏 1
点赞 0
评论 0
<?php
/**
 * 得到唯一识别码
 * 修改自Twitter的Snowflake算法
 * 此算法支持分布式自增ID
 * @author cwsky@163.com
 */

abstract class Uniq
{
	//初始时间码,开站设定一次,可用以下语句得到
	//floor(microtime(true) * 1000);
	private static $twepoch = 1380553425155;

	//数据中心,8表示可以有255个数据中心,最大取值为8
	private static $dataCenterIDBits = 8;

	//数据中心ID最大值
	//private static $maxDatacenterID = -1 ^ (-1 << $datacenterIDBits);

	//机器标识符,13表示可以有8191台机器,最大取值为13
	//当dataCenterIDBits与workerIDBits变大时,会产生负数,就不好玩了
	private static $workerIDBits = 13;

	//机器ID最大值
	//private static $maxWorkerId = -1 ^ (-1 << $workerIDBits);

	//毫秒内自增位
	private static $sequenceBits = 12;

	//机器ID偏左移12位
	//private static $workerIDShift = self::$sequenceBits;
	private static $workerIDShift = 12;

	//数据中心ID左移17位
	//private $dataCenterIDShift = $sequenceBits + $workerIDBits;

	//时间毫秒左移22位
	//private $timestampLeftShift = $sequenceBits + $workerIDBits + $datacenterIDBits;
	//private $sequenceMask = -1 ^ (-1 << $sequenceBits);

	private static $lastTimestamp = -1;

	private static $sequence = 0;

	public static function id($dataCenterID, $workerID)
	{
		//数据中心ID最大值
		$maxDataCenterID = -1 ^ (-1 << self::$dataCenterIDBits);

		//机器ID最大值
		$maxWorkerID = -1 ^ (-1 << self::$workerIDBits);

		//数据中心ID左移17位
		$dataCenterIDShift = self::$sequenceBits + self::$workerIDBits;

		//时间毫秒左移22位
		$timestampLeftShift = self::$sequenceBits + self::$workerIDBits + self::$dataCenterIDBits;
		$sequenceMask = -1 ^ (-1 << self::$sequenceBits);

		//检查workerID完整性
		if($workerID > $maxWorkerID || $workerID < 0)
		{
			return 0;
		}

		//检查数据中心完整性
		if($dataCenterID > $maxDataCenterID || $dataCenterID < 0)
		{
			return 0;
		}

		//echo sprintf("worker starting. timestamp left shift %d, datacenter id bits %d, maxDatacenterID:%d, worker id bits %d, maxWorkerID:%d, sequence bits %d, workerid %d", $timestampLeftShift, self::$dataCenterIDBits, $maxDataCenterID, self::$workerIDBits, $maxWorkerID, self::$sequenceBits, $workerID);

		$timestamp = self::timeGen();

		if($timestamp < self::$lastTimestamp)
		{
			return 0;
		}

		if (self::$lastTimestamp == $timestamp)
		{
			//当前毫秒内,则+1
			self::$sequence = (self::$sequence + 1) & $sequenceMask;
			if(self::$sequence == 0)
			{
				//当前毫秒内计数满了,则等待下一秒
				$timestamp = self::tilNextMillis(self::$lastTimestamp);
			}
		}
		else
		{
			self::$sequence = 0;
		}

		self::$lastTimestamp = $timestamp;

		$id = (($timestamp - self::$twepoch << $timestampLeftShift)) | ($dataCenterID << $dataCenterIDShift) | ($workerID << self::$workerIDShift) | (self::$sequence);

		return $id;
	}

	public static function timeGen()
	{
		return floor(microtime(true) * 1000);
	}

	public static function tilNextMillis($lastTimestamp)
	{
		$timestamp = self::timeGen();

		while($timestamp <= $lastTimestamp)
		{
			$timestamp = self::timeGen();
		}

		return $timestamp;
	}

	public static function getUUID()
	{
		return strtoupper(sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
	        // 32 bits for "time_low"
	        mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ),

	        // 16 bits for "time_mid"
	        mt_rand( 0, 0xffff ),

	        // 16 bits for "time_hi_and_version",
	        // four most significant bits holds version number 4
	        mt_rand( 0, 0x0fff ) | 0x4000,

	        // 16 bits, 8 bits for "clk_seq_hi_res",
	        // 8 bits for "clk_seq_low",
	        // two most significant bits holds zero and one for variant DCE1.1
	        mt_rand( 0, 0x3fff ) | 0x8000,

	        // 48 bits for "node"
	        mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff )
	    ));
	}
}
?>


© 著作权归作者所有

共有 人打赏支持
思_无_邪

思_无_邪

粉丝 2
博文 3
码字总数 4338
作品 1
海淀
CTO(技术副总裁)
PHP唯一ID生成扩展--Atom

使用Twitter的 Snowflake算法,有兴趣可以了解一下这个算法: https://github.com/twitter/snowflake php.ini的配置项: [ukey]ukey.datacenter = integerukey.worker = integerukey.twepoch ......

liexusong
2013/08/27
3.7K
1
一个实现 Twitter SnowFlake 算法 的 Go 分布式 UID 生成器

goSnowFlake According to the Twitter SnowFlake Theory, A ThreadSafe Unique ID Generator written by Golang 根据 Twitter SnowFlake 算法, 实现的分布式线程安全 UID 生成器 Feature 线......

ethantonylam
2016/04/07
48
0
分布式高效有序 ID 生产--dsequence

高性能(理论QPS > 400w/s)GUID产生算法(sequence),基于Snowflake实现64位自增ID算法。 Twitter-Snowflake算法产生的背景相当简单,为了满足Twitter每秒上万条消息的请求,每条消息都必须分...

李景枫
2017/04/27
287
0
扯扯ID

🙂🙂🙂关注微信公众号:【芋艿的后端小屋】有福利: RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表 RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址 您对于源码...

芋道源码掘金Java群217878901
2017/06/11
0
0
golang 实现的 id 发号器--gosnowflake

gosnowflake 是一个golang 实现的 id 发号器,使用的是twitter的snowflake的算法,对twitter的snowflake项目进行了一些改造和优化,变的更可靠,现在主要是采用golang的gob编码rpc方式调用。...

LoveSai
2014/05/04
1K
0
gosnowflake 发布 1.0.1

gosnowflake 是一个golang 实现的 id 发号器,使用的是twitter的snowflake的算法,对twitter的snowflake项目进行了一些改造和优化,变的更可靠,现在主要是采用golang的gob编码rpc方式调用。...

LoveSai
2014/05/04
201
0
李景枫/sequence

分布式高效ID生产黑科技(sequence) 开源产品介绍(微服务基础设施QQ交流群:191958521) 配置中心(mconf) GITHUB:https://github.com/yu120/mconf 码云:https://git.oschina.net/yu120/mco...

李景枫
2016/07/08
0
0
Twitter-Snowflake,64位自增ID算法详解

Twitter-Snowflake算法产生的背景相当简单,为了满足Twitter每秒上万条消息的请求,每条消息都必须分配一条唯一的id,这些id还需要一些大致的顺序(方便客户端排序),并且在分布式系统中不同...

毛爷爷夸我帅
2016/05/10
448
0
关于全局ID,雪花(snowflake)算法的说明

上次简单的说一下:http://www.cnblogs.com/dunitian/p/6041745.html#uid C#版本的国外朋友已经封装了,大家可以去看看:https://github.com/ccollie/snowflake-net 强大的网友出来个简化版本...

毒逆天
2016/12/04
0
0
ID生成器--idCreator

idCreator是我们设计并且开发一个分布式的id生成器。它主要为业务系统提供唯一、索引友好、 可排序的id。它解决了互联网行业中,使用int自增id或者是string类型的自定义id而导致的 无法方便的...

xuhf
2016/04/26
1K
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

NNS域名系统之域名竞拍

0x00 前言 其实在官方文档中已经对域名竞拍的过程有详细的描述,感兴趣的可以移步http://doc.neons.name/zh_CN/latest/nns_protocol.html#id30 此处查阅。 我这里主要对轻钱包开发中会用到的...

暖冰
今天
0
0
32.filter表案例 nat表应用 (iptables)

10.15 iptables filter表案例 10.16/10.17/10.18 iptables nat表应用 10.15 iptables filter表案例: ~1. 写一个具体的iptables小案例,需求是把80端口、22端口、21 端口放行。但是,22端口我...

王鑫linux
今天
0
0
shell中的函数&shell中的数组&告警系统需求分析

20.16/20.17 shell中的函数 20.18 shell中的数组 20.19 告警系统需求分析

影夜Linux
今天
0
0
Linux网络基础、Linux防火墙

Linux网络基础 ip addr 命令 :查看网口信息 ifconfig命令:查看网口信息,要比ip addr更明了一些 centos 7默认没安装ifconfig命令,可以使用yum install -y net-tools命令来安装。 ifconfig...

李超小牛子
今天
1
0
[机器学习]回归--Decision Tree Regression

CART决策树又称分类回归树,当数据集的因变量为连续性数值时,该树算法就是一个回归树,可以用叶节点观察的均值作为预测值;当数据集的因变量为离散型数值时,该树算法就是一个分类树,可以很...

wangxuwei
昨天
1
0
Redis做分布式无锁CAS的问题

因为Redis本身是单线程的,具备原子性,所以可以用来做分布式无锁的操作,但会有一点小问题。 public interface OrderService { public String getOrderNo();} public class OrderRe...

算法之名
昨天
10
0
143. Reorder List - LeetCode

Question 143. Reorder List Solution 题目大意:给一个链表,将这个列表分成前后两部分,后半部分反转,再将这两分链表的节点交替连接成一个新的链表 思路 :先将链表分成前后两部分,将后部...

yysue
昨天
1
0
数据结构与算法1

第一个代码,描述一个被称为BankAccount的类,该类模拟了银行中的账户操作。程序建立了一个开户金额,显示金额,存款,取款并显示余额。 主要的知识点联系为类的含义,构造函数,公有和私有。...

沉迷于编程的小菜菜
昨天
1
0
从为什么别的队伍总比你的快说起

在机场候检排队的时候,大多数情况下,别的队伍都要比自己所在的队伍快,并常常懊悔当初怎么没去那个队。 其实,最快的队伍只能有一个,而排队之前并不知道那个队快。所以,如果有六个队伍你...

我是菜鸟我骄傲
昨天
1
0
分布式事务常见的解决方案

随着互联网的发展,越来越多的多服务相互之间的调用,这时候就产生了一个问题,在单项目情况下很容易实现的事务控制(通过数据库的acid控制),变得不那么容易。 这时候就产生了多种方案: ...

小海bug
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部