雪花算法实现

雪花算法实现

在laravel中实现雪花算法


1599733143891

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
class SnowFake
{
CONST START_TIME = '2020-01-01 00:00:00'; # 起始时间
CONST MAX40_BIN_DEC = 1099511627775;
CONST MAX12_BIN_DEC = 4095;
CONST MAX10_BIN_DEC = 1023;

STATIC LAST_MID = 0; # 最新机器码
STATIC SEQUENCE_NUM = 0; # 最新序列码


/**
* @desc 雪花算法生成唯一ID,
* 支持从开始时间约69年时间内,
* 1024台机器,每秒4096000个唯一ID
* @return float|int|string
*/
public static function Union_Id(){
$first_bin = '0'; # 1/64 符号位
$now_time = floor(microtime(true) * 1000);
$start_time = strtotime(self::START_TIME) * 1000;
$diff_time = $now_time - $start_time;
$diff_time_bin = base_convert($diff_time, 10, 2);
$diff_time_bin = str_pad($diff_time_bin,41,'0', STR_PAD_LEFT);
$second_bin = $diff_time_bin; # 2-42/64 时间戳位
self::setSequence();
self::getMid();
$mid_bin = decbin(self::$LAST_MID);
$third_bin = str_pad($mid_bin, 10, '0', STR_PAD_LEFT); # 42-52/64 数据中心+机器码位
$sequence_bin = decbin(self::$SEQUENCE_NUM);
$forth_bin = str_pad($sequence_bin, 12, '0', STR_PAD_LEFT); # 52-64/64 序列编号位
$union_bin = $first_bin . $second_bin . $third_bin . $forth_bin;
$bin_dec = base_convert($union_bin,2,10);
return $bin_dec;
}


private static function getMid()
{
// $machine_code = config('original.Machine_Code');
// if ($machine_code < 1 || $machine_code > 1023) {
// self::Error(5018,['env Config: MACHINE_CODE error, must be int between 1 and 1023']);
// }
// self::$LAST_MID = $machine_code;
if (self::$SEQUENCE_NUM >= self::MAX12_BIN_DEC){
self::$LAST_MID ++;
if (self::$LAST_MID > self::MAX10_BIN_DEC){
self::$LAST_MID = 0;
}
}
}

private static function setSequence()
{
self::$SEQUENCE_NUM ++;
if (self::$SEQUENCE_NUM > self::MAX12_BIN_DEC){
self::$SEQUENCE_NUM = 0;
}
}
}