Twitter在2010年开源了内部团队使用的全球唯一ID生成算法Snowflake,译为SnowflakeAlgorithm。Snowflake不依赖数据库,可以直接用编程语言生成。它连续生成的3个ID是这样的563583455628754944、563583466173235200、563583552944996352。Snowflake使用64位来存储组成ID的4个部分:?最高位占1位,值固定为0,保证生成的ID是正数;?中间位占41位,值为毫秒时间戳;?Medium低位占10位,值为工作机器的ID,取值上限为1024;?最后一位占12位,取值为当前毫秒内生成的不同ID,取值上限为4096;这种设计允许在1毫秒内生成多达4096个ID,并且由于中位数是时间戳,因此生成的ID是顺序递增的。Snowflake的代码实现代码实现中有一个重要的知识点——位运算。不懂位运算的小伙伴,请阅读本书的位运算章节(《Python 编程参考》)开始学习。首先我们引入必要的库,并设置中下位和最后一位的长度:importtimeimportlogging#allocationpositionWORKER_BITS=5DATACENTER_BITS=5SEQUENCE_BITS=12这里中下位包含5个机房ID和5个机器ID,它们共同组成10个中下位置。然后通过机房和机器的长度上限;#设置设备数量上限WORKER_UPPER_LIMIT=-1^(-1<WORKER_UPPER_LIMIT:raiseValueError('WORKERID高于上限')ifworker_id<0:raiseValueError('WORKERID低于下限')ifdata_center_id>DATACENTER_UPPER_LIMIT:raiseValueError('DATACENTERIDisabovetheupperlimit')ifdata_center_id<0:raiseValueError('DATACENTERIDisbelowthelowerlimit')self.worker_id=worker_idself.datacenter_id=data_center_idself.sequence=sequenceself.last_timestamp=-1#最后生成的数字的时间戳时间戳的生成很简单,但是我们应该写代码的时候注意函数单一职责原则,所以单独拿出一个函数:@staticmethoddef_timestamp(n=1e3):"""指定位数的时间戳"""returnint(time.time()*n)如果单位时间内产生的次数超过上限,则需要等到下一次单位时间,对应代码如下:def_wait_next_time(self,last_timestamp):"""等到下一个单位时间"""timestamp=self._timestamp()whiletimestamp<=last_timestamp:timestamp=self._timestamp()return取时间戳涉及的操作比较多,比如验证时间是否回调,单位时间内产生的数量是否超限,生成账户等,所以需要拆分成多个小函数和遵循单一职责原则:deftake(self)->int:"""获取一个数"""timestamp=self._timestamp()self._check(timestamp)self.last_timestamp=timestamp#更新最后一次的时间戳生成的数字returnself._generate(timestamp)def_generate(self,timestamp):"""Generateanumber"""number=((timestamp-EPOCH)<