59 lines
1.3 KiB
PHP
59 lines
1.3 KiB
PHP
<?php
|
|
|
|
|
|
namespace addons\epay\library;
|
|
|
|
|
|
/**
|
|
* 雪花算法生成唯一id
|
|
* Class SnowFlake
|
|
* @package app\xilufitness\library
|
|
*/
|
|
|
|
class SnowFlake {
|
|
|
|
protected static $instance;
|
|
private static $machineId;
|
|
|
|
private function __construct() {
|
|
self::$machineId = ip2long(gethostbyname(gethostname()));
|
|
}
|
|
|
|
public static function getInstance() {
|
|
if (self::$instance === null) {
|
|
self::$instance = new self();
|
|
}
|
|
return self::$instance;
|
|
}
|
|
|
|
public function createID(){
|
|
// 假设一个机器id
|
|
// $machineId = ip2long(gethostbyname(gethostname()));
|
|
|
|
//41bit timestamp(毫秒)
|
|
$time = floor(microtime(true) * 1000);
|
|
|
|
//0bit 未使用
|
|
$suffix = 0;
|
|
|
|
//datacenterId 添加数据的时间
|
|
$base = decbin(pow(2,40) - 1 + $time);
|
|
|
|
//workerId 机器ID
|
|
$machineid = decbin(pow(2,9) - 1 + self::$machineId);
|
|
|
|
//毫秒类的计数
|
|
$random = mt_rand(1, pow(2,11)-1);
|
|
|
|
$random = decbin(pow(2,11)-1 + $random);
|
|
//拼装所有数据
|
|
$base64 = $suffix.$base.$machineid.$random;
|
|
//将二进制转换int
|
|
$base64 = bindec($base64);
|
|
|
|
return sprintf('%.0f', $base64);
|
|
}
|
|
}
|
|
|
|
//$id = (SnowFlake::getInstance())->createID();
|