PHP生成唯一ID方法整理
2021-01-26 20:12
标签:ack class 联网 cti gre cond mic work uniq PHP生成唯一ID方法整理 标签:ack class 联网 cti gre cond mic work uniq 原文地址:https://blog.51cto.com/phpme/2508142
2.session_create_id()
3.雪花算法
下面代码摘自互联网
$this->maxWorkerId || $workerId maxWorkerId} or less than 0");
}
if ($datacenterId > $this->maxDatacenterId || $datacenterId maxDatacenterId} or less than 0");
}
$this->workerId = $workerId;
$this->datacenterId = $datacenterId;
$this->sequence = $sequence;
}
public function nextId()
{
$timestamp = $this->timeGen();
if ($timestamp lastTimestamp) {
$diffTimestamp = bcsub($this->lastTimestamp, $timestamp);
throw new Exception("Clock moved backwards. Refusing to generate id for {$diffTimestamp} milliseconds");
}
if ($this->lastTimestamp == $timestamp) {
$this->sequence = ($this->sequence + 1) & $this->sequenceMask;
if (0 == $this->sequence) {
$timestamp = $this->tilNextMillis($this->lastTimestamp);
}
} else {
$this->sequence = 0;
}
$this->lastTimestamp = $timestamp;
/*$gmpTimestamp = gmp_init($this->leftShift(bcsub($timestamp, self::TWEPOCH), $this->timestampLeftShift));
$gmpDatacenterId = gmp_init($this->leftShift($this->datacenterId, $this->datacenterIdShift));
$gmpWorkerId = gmp_init($this->leftShift($this->workerId, $this->workerIdShift));
$gmpSequence = gmp_init($this->sequence);
return gmp_strval(gmp_or(gmp_or(gmp_or($gmpTimestamp, $gmpDatacenterId), $gmpWorkerId), $gmpSequence));*/
return (($timestamp - self::TWEPOCH) timestampLeftShift) |
($this->datacenterId datacenterIdShift) |
($this->workerId workerIdShift) |
$this->sequence;
}
protected function tilNextMillis($lastTimestamp)
{
$timestamp = $this->timeGen();
while ($timestamp timeGen();
}
return $timestamp;
}
protected function timeGen()
{
return floor(microtime(true) * 1000);
}
// 左移