php生成员工编号,使用SnowFlake算法生成唯一ID
分类:web前端

消除办法:$str=”QB”.str_pad(($maxid[0]["max(id)"]+1),5,”0″,STR_PAD_LEFT );

由于一些原因需求获得数据库最大的id值。所以现身了这段php 获取数据库最大的id代码了。那之中的max(id卡塔尔(قطر‎ 那之中的id 正是要得到最大的id了。假若是别的字段请填入为其它字段 

酌量过的格局有

其中$maxid[0]["max(id)"]+1卡塔尔(قطر‎是利用max函数从数据库中找也ID最大的三个值, ID为主键,不会再也。

得到数据库中最大的id的值

  • 间接用时间戳,恐怕以此衍生的一多如牛毛措施

  • Mysql自带的uuid

str_pad(卡塔尔国 函数把字符串填充为钦赐的长短。

$fh = mysql_query("select MAX(id) from master");
$c_echo = mysql_fetch_array($fh);
 var_dump($c_echo);

如上三种艺术都得以查到就十分少做表明了

语法

接下来拿走工作者编号

最终甄选了Twitter的斯诺Flake算法

str_pad(string,length,pad_string,pad_type)

$str=”QB”.str_pad(($maxid[0]["max(id)"]+1),5,”0″,STR_PAD_LEFT );

以此算法的功利很简短能够在每秒产生约400W个例外的十四人数字ID(10进制卡塔尔(قطر‎

参数 描述
string 必需。规定要填充的字符串。
length 必需。规定新字符串的长度。如果该值小于原始字符串的长度,则不进行任何操作。
pad_string 可选。规定供填充使用的字符串。默认是空白。
pad_type 可选。规定填充字符串的那边。可能的值:

  • STR_PAD_BOTH – 填充到字符串的两头。如果不是偶数,则右侧获得额外的填充。
  • STR_PAD_LEFT – 填充到字符串的左侧。
  • STR_PAD_RIGHT – 填充到字符串的右侧。这是默认的。

str_pad(卡塔尔 函数把字符串填充为内定的长度。

规律超级粗略

语法

str_pad(string,length,pad_string,pad_type)

参数     描述
string     必需。规定要填充的字符串。
length     必需。规定新字符串的长度。如果该值小于原始字符串的长度,则不进行任何操作。
pad_string     可选。规定供填充使用的字符串。默认是空白。
pad_type     可选。规定填充字符串的那边。可能的值:

    STR_PAD_BOTH – 填充到字符串的两头。如果不是偶数,则右侧获得额外的填充。
    STR_PAD_LEFT – 填充到字符串的左侧。
    STR_PAD_RIGHT – 填充到字符串的右侧。这是默认的。

ID由64bit组成

诸如此比就马到功成了出品,工作者都试用

其中 第一个bit空缺

 

41bit用来寄放皮秒级时间戳

10bit用于贮存机械id

12bit用以存放自增ID

 

除此之外最高位bit标识为不可用以外,别的三组bit占位均可转移,看现实的作业须要而定。暗中同意情况下41bit的时光戳可以扶植该算法使用到2082年,10bit的行事机器id能够支撑1023台机械,类别号帮助1皮秒发生40九十几个自增体系id。

<?php
namespace AppServices;

abstract class Particle {
    const EPOCH = 1479533469598;
    const max12bit = 4095;
    const max41bit = 1099511627775;

    static $machineId = null;

    public static function machineId($mId = 0) {
        self::$machineId = $mId;
    }

    public static function generateParticle() {
        /*
        * Time - 42 bits
        */
        $time = floor(microtime(true) * 1000);

        /*
        * Substract custom epoch from current time
        */
        $time -= self::EPOCH;

        /*
        * Create a base and add time to it
        */
        $base = decbin(self::max41bit + $time);

        /*
        * Configured machine id - 10 bits - up to 1024 machines
        */
        if(!self::$machineId) {
            $machineid = self::$machineId;
        } else {
            $machineid = str_pad(decbin(self::$machineId), 10, "0", STR_PAD_LEFT);
        }
        
        /*
        * sequence number - 12 bits - up to 4096 random numbers per machine
        */
        $random = str_pad(decbin(mt_rand(0, self::max12bit)), 12, "0", STR_PAD_LEFT);

        /*
        * Pack
        */
        $base = $base.$machineid.$random;

        /*
        * Return unique time id no
        */
        return bindec($base);
    }

    public static function timeFromParticle($particle) {
        /*
        * Return time
        */
        return bindec(substr(decbin($particle),0,41)) - self::max41bit + self::EPOCH;
    }
}

?>

调用方法如下

Particle::generateParticle($machineId);//生成ID
Particle::timeFromParticle($particle);//反向计算时间戳

 

本文由10bet手机官网发布于web前端,转载请注明出处:php生成员工编号,使用SnowFlake算法生成唯一ID

上一篇:记录方法调用参数上下文arguments 下一篇:PHP文件上传详解,PHP文件上传代码用法详解
猜你喜欢
热门排行
精彩图文