<?php
/**
* Id生成器
* Auth:乐杨俊
* Class IdGenerator
*/
namespace Leyangjun\Comm\Services\IdGenerator;
class IdGenerator
{
private $_idGeneratorKey;
private function __construct($idGeneratorKey = ''){
if(!$idGeneratorKey){
$this->_idGeneratorKey = 'default';
}else{
$this->_idGeneratorKey = $idGeneratorKey;
}
}
/**
* 发号
* @param $business_id
* @param int $num
* @param null $configs
* @return array|bool|mixed
*/
public function get($business_id, $num = 1, $configs = null)
{
if ($business_id > pow(2, 6) || $business_id < 1) {
// 超过业务池大小
return false;
}
$app = App::getInstance();
if (is_null($configs)) {
$configs = $app->env('id_generator.default');
}
$FwIdGenerator = FwIdGenerator::getInstance($configs);
$result = array();
$num = abs(intval($num));
for ($i = 0; $i < $num; ++$i) {
if (isDevlopEnv() || isPreEnv()) {
$id = $this->generateBusinessID($business_id);
} else {
$id = $FwIdGenerator->getId($business_id);
}
if (!$id) {
//兼容本地策略
$id = $this->generateBusinessID($business_id);
}
$result[] = $id;
}
if ($num == 1) {
return $result[0];
}
return $result;
}
/**
* 生成业务ID
* @param int $business_id
* @param int $created_at
* @return bool|int
*/
public function generateBusinessID($business_id = 1, $created_at = null)
{
if ($created_at) {
$time = $created_at * 1000 + rand(0, 999);
} else {
$time = round(microtime(true) * 1000); //使用当前时间戳
}
if ($business_id > pow(2, 6)) {
return false;
}
$increment = rand(0, pow(2, 9));
$id = $time << (64 - 42);
$id |= 0 << 16; // 写入IDC
$id |= $business_id << 10; // 写入业务类型
$id |= $increment;
return $id;
}
}
PHP ID生成器
原创
©著作权归作者所有:来自51CTO博客作者LecKey的原创作品,请联系作者获取转载授权,否则将追究法律责任
上一篇:PHP RSA加密解密工具类
下一篇:PHP根据多个键分组|多字段分组
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
shortid id生成器
shortid 简短的非顺序url友好型唯一ID生成器。ShortId 库创建的短的非顺序的url唯一ID。 非常适合网址缩短器,MongoDB和Redis ID,以及其他用户可能会看到的ID。
id生成器 shortid 生成器 mongodb 3d -
redis主键生成器 redis 自增id生成器
原理:设置一个时间戳,默认1640995200L。设置序列号32位为默认值。将时间戳和序列号拼接。
redis java 数据库 时间戳 序列号