我是靠谱客的博主 可耐面包,最近开发中收集的这篇文章主要介绍php:雪花算法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

简介

        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:雪花算法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(66)

评论列表共有 0 条评论

立即
投稿
返回
顶部