Python实现基于雪花算法生成唯一ID

47 篇文章 108 订阅 ¥29.90 ¥99.00

前言

本文是该专栏的第46篇,后面会持续分享python的各种干货知识,值得关注。

雪花算法(Snowflake Algorithm)是Twitter开源的一个分布式ID生成算法,其结果是一个long型的ID。这个算法生成的ID趋势递增,且ID中包含了时间戳、机器码和序列号等信息,使得在分布式系统中生成的ID具有全局唯一性。

而本文,笔者将通过实际案例,通过python基于雪花算法的基础上,生成唯一的ID。具体的细节部分,笔者在正文将结合实际完整代码案例进行详细说明。废话不多说,跟着笔者直接往下看正文详细内容。(附完整代码)

正文

1. 运行环境以及调用示例说明

需要注意的是,笔者在本文中分享的代码示例,需要基于python3.6+以上版本。

在该案例中,笔者会将调用功能全部封装在基于source文件夹下面的python脚本中,示例如下所示:

换言之,我们只需要在外部定义一个python脚本来调用source里面的功能即可。

以调用方法为例进行说明,其中

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
雪花算法,也叫做Snowflake算法,是一种分布式唯一ID生成算法。它的核心思想是,将一个64位的long型分成5个部分,分别表示时间戳、数据中心、机器编号、序列号等信息,然后将这些信息组合成一个64位的唯一ID。 具体实现如下: 1. 时间戳部分 时间戳部分占用42位,可以精确到毫秒级别。在Snowflake算法中,时间戳的起始时间可以自定义。一般情况下,我们可以将其设置为某个固定的时间,比如2010年1月1日。 2. 数据中心和机器编号部分 数据中心和机器编号部分共占用12位,可以分别表示4096个数据中心和每个数据中心下的4096个机器编号。这样就可以保证全局唯一性。 3. 序列号部分 序列号部分占用10位,可以表示1024个序列号。如果同一毫秒内生成ID超过1024个,就需要等到下一毫秒再继续生成实现代码如下: ```python import time class Snowflake: def __init__(self, datacenter_id, worker_id): self.datacenter_id = datacenter_id self.worker_id = worker_id self.start_time = 1262275200000 # 2010-01-01 00:00:00 self.last_timestamp = -1 self.sequence = 0 def _gen_timestamp(self): return int(time.time() * 1000) def _next_millis(self, last_timestamp): timestamp = self._gen_timestamp() while timestamp <= last_timestamp: timestamp = self._gen_timestamp() return timestamp def gen_id(self): timestamp = self._gen_timestamp() if timestamp < self.last_timestamp: raise ValueError('Clock moved backwards') if timestamp == self.last_timestamp: self.sequence = (self.sequence + 1) % 1024 if self.sequence == 0: timestamp = self._next_millis(self.last_timestamp) else: self.sequence = 0 self.last_timestamp = timestamp return ((timestamp - self.start_time) << 22) | \ (self.datacenter_id << 10) | \ (self.worker_id << 2) | \ self.sequence ``` 使用示例: ```python snowflake = Snowflake(datacenter_id=1, worker_id=1) for i in range(10): print(snowflake.gen_id()) ``` 输出结果: ``` 952323154510714880 952323154510714881 952323154510714882 952323154510714883 952323154510714884 952323154510714885 952323154510714886 952323154510714887 952323154510714888 952323154510714889 ``` 以上就是一个简单的雪花算法生成唯一ID实现

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

写python的鑫哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值