概述
简介
SnowFlake 算法(雪花算法),是 Twitter 开源的分布式 id 生成算法。其核心思想就是:使用一个 64 bit 的 long 型的数字作为全局唯一 id。在分布式系统中的应用十分广泛,且ID 引入了时间戳,基本上保持自增的。
原理
1bit-不用:因为二进制中最高位是符号位,1表示负数,0表示正数。生成的id一般都是用正整数,所以最高位固定为0。
41bit-时间戳:表示的是时间戳,41 bit 可以表示的数字多达 2^41 - 1,也就是可以标识 2 ^ 41 - 1 个毫秒值,换算成年就是表示 69 年的时间。
10bit-工作机器id:表示服务器id,代表的是这个服务最多可以部署在 2^10 台机器上,也就是 1024 台机器。
12bit-序列号:表示1毫秒内产生的不同 id,12 bit 可以代表的最大正整数是 2 ^ 12 - 1 = 4096,也就是说可以用这个 12 bit 代表的数字来区分同一个毫秒内的 4096 个不同的 id。
demo
<?php
class SnowFlake
{
/**
* 开始时间
*/
const STARTTIME = 1635645354000;
/**
* 12位随机序列号范围
*/
const MAX12BIT = 4095;
/**
* 41位初始时间戳
*/
const MAX41BIT = 1000000000000;
/**
*@var $machineId 10位机器码
*/
static $machineId = 1;
public static function createId($server = 1)
{
if ($server) {
self::$machineId = $server;
}
// 当前时间戳微秒取整
$time = floor(microtime(true) * 1000);
// 当前时间减去开始时间的时间差(可以使41bit-时间戳最大化使用)
$time -= self::STARTTIME;
// 41位二进制码
$base = decbin(self::MAX41BIT + $time);
// 第一位补0
$base = str_pad($base, 42, "0", STR_PAD_LEFT);
// 10位机器码
$machineid = str_pad(decbin(self::$machineId), 10, "0", STR_PAD_LEFT);
// 12随机序列号
$random = str_pad(decbin(mt_rand(0, self::MAX12BIT)), 12, "0", STR_PAD_LEFT);
// 64位
$base = $base . $machineid . $random;
return bindec($base);
}
}
echo SnowFlake::createId();
可能出现的问题
雪花算法在单机系统上ID是递增的,但是在分布式系统多节点的情况下,所有节点的时钟并不能保证不完全同步,所以有可能会出现不是全局递增的情况。
最后
以上就是可耐面包为你收集整理的php:雪花算法的全部内容,希望文章能够帮你解决php:雪花算法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复