Twitter的snowflake广泛用于分布式生成唯一UUID,网上也有很多基于snowflake的一些变种的算法。snowflake生成的UUID很多都是在分布式场景下使用的。在网上看了一些,里面有几个没有考虑线程安全的PHP实现。现在PHP有了Swoole锁和协程的支持,对于我们开发线程安全和高并发的模拟是非常方便的。这里我们使用PHP结合Swoole来学习实现最简单的snowflake(好久没写PHP了,感觉没有IDE,不会再写PHP了)。先看snowflake的如下结构:生成的值是64位,分为4部分:第一位是符号位,最高位是0,表示正数。第二部分,41位,用于记录生成ID时的时间戳,单位是毫秒,所以这部分代表的取值范围是2^41-1(69年),是相对于a的偏移量一定时间。第三部分的10位表示工作节点的ID,表示取值范围为2^10-1,相当于支持1024个节点。第四部分的12位表示每个工作节点每毫秒产生的循环自增id,最多可以产生2^12-1个id。以毫秒为单位重新递增,先粘贴代码:self::WORKER_MAX){trigger_error("WorkerID超出范围");退出(0);}$this->timestamp=0;$this->workerId=$workerId;$this->序列=0;$this->lock=newswoole_lock(SWOOLE_MUTEX);}/***生成ID*@returnint*/publicfunctiongetId(){$this->lock->lock();//记得在这里锁定$now=$this->now();如果($this->timestamp==$now){$this->sequence++;if($this->sequence>self::SEQUENCE_MAX){//当前毫秒生成的序号已经超出最大范围,等待下一毫秒重新生成while($now<=$this->timestamp){$now=$this->now();}}}else{$this->sequence=0;}$this->timestamp=$now;//更新ID以生成时间戳$id=(($now-self::EPOCH)<
