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;
public static function Union_Id(){ $first_bin = '0'; $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; self::setSequence(); self::getMid(); $mid_bin = decbin(self::$LAST_MID); $third_bin = str_pad($mid_bin, 10, '0', STR_PAD_LEFT); $sequence_bin = decbin(self::$SEQUENCE_NUM); $forth_bin = str_pad($sequence_bin, 12, '0', STR_PAD_LEFT); $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() {
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; } } }
|