一、雪花算法图解

理论一大堆,总结如下图:

下方为源码,返回的结果为19位,为10进制表示,使用二进制表示就是64位,所以不必有所疑惑。

二、源码

1、异常捕获块

文件名:exceptions.py

class InvalidSystemClock(Exception):"""时钟回拨异常"""pass

2、唯一id生成块

文件名:xuehuaid.py

# Twitter's Snowflake algorithm implementation which is used to generate distributed IDs.
# https://github.com/twitter-archive/snowflake/blob/snowflake-2010/src/main/scala/com/twitter/service/snowflake/IdWorker.scalaimport time
import loggingfrom .exceptions import InvalidSystemClock# 64位ID的划分
WORKER_ID_BITS = 5
DATACENTER_ID_BITS = 5
SEQUENCE_BITS = 12# 最大取值计算
MAX_WORKER_ID = -1 ^ (-1 << WORKER_ID_BITS)  # 2**5-1 0b11111
MAX_DATACENTER_ID = -1 ^ (-1 << DATACENTER_ID_BITS)# 移位偏移计算
WOKER_ID_SHIFT = SEQUENCE_BITS
DATACENTER_ID_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS
TIMESTAMP_LEFT_SHIFT = SEQUENCE_BITS + WORKER_ID_BITS + DATACENTER_ID_BITS# 序号循环掩码
SEQUENCE_MASK = -1 ^ (-1 << SEQUENCE_BITS)# Twitter元年时间戳
TWEPOCH = 1288834974657logger = logging.getLogger('flask.app')class IdWorker(object):"""用于生成IDs"""def __init__(self, datacenter_id, worker_id, sequence=0):"""初始化:param datacenter_id: 数据中心(机器区域)ID:param worker_id: 机器ID:param sequence: 其实序号"""# sanity checkif worker_id > MAX_WORKER_ID or worker_id < 0:raise ValueError('worker_id值越界')if datacenter_id > MAX_DATACENTER_ID or datacenter_id < 0:raise ValueError('datacenter_id值越界')self.worker_id = worker_idself.datacenter_id = datacenter_idself.sequence = sequenceself.last_timestamp = -1  # 上次计算的时间戳def _gen_timestamp(self):"""生成整数时间戳:return:int timestamp"""return int(time.time() * 1000)def get_id(self):"""获取新ID:return:"""timestamp = self._gen_timestamp()# 时钟回拨if timestamp < self.last_timestamp:logging.error('clock is moving backwards. Rejecting requests until {}'.format(self.last_timestamp))raise InvalidSystemClockif timestamp == self.last_timestamp:self.sequence = (self.sequence + 1) & SEQUENCE_MASKif self.sequence == 0:timestamp = self._til_next_millis(self.last_timestamp)else:self.sequence = 0self.last_timestamp = timestampnew_id = ((timestamp - TWEPOCH) << TIMESTAMP_LEFT_SHIFT) | (self.datacenter_id << DATACENTER_ID_SHIFT) | \(self.worker_id << WOKER_ID_SHIFT) | self.sequencereturn new_iddef _til_next_millis(self, last_timestamp):"""等到下一毫秒"""timestamp = self._gen_timestamp()while timestamp <= last_timestamp:timestamp = self._gen_timestamp()return timestampif __name__ == '__main__':worker = IdWorker(1, 2, 0)print(worker.get_id())

三、python雪花库

当然,如果不嫌麻烦,可以安装python雪花id生成库,如下:

1、安装

pip install pysnowflake

2、启动

启动pysnowflake —pysnowflake基于Tornado开发,启动时相当于一个服务

snowflake_start_server \
--address=0.0.0.0 \
--port=8910 \
--dc=1 \
--worker=1 \
--log_file_prefix=/tmp/pysnowflask.log

参数说明:可以通过–help查看

—address:本机的IP地址默认localhost
—dc:数据中心唯一标识符默认为0
—worker:工作者唯一标识符默认为0
—log_file_prefix:日志文件所在位置

也可以后台启动,如下:

nohup snowflake_start_server --address=127.0.0.1 --port=8910 --dc=1 --worker=1 --log_file_prefix=/tmp/pysnowflask.log>/dev/null &

3、获取id

import snowflake.client
def get_snowflake_uuid():guid = snowflake.client.get_guid()return guid
get_snowflake_uuid()

4、注意

  • 对于并发项目,需要保证datacenter_id, worker_id组合的唯一性,不然也会出现相同ID的情况。

python版雪花算法生成唯一ID相关推荐

  1. 基于雪花算法生成用户id

    8.1 为啥这样做 1.全局唯一性,不会出现重复的id.如果通过id自增来保证id不重复,则该表 无法分表操作例如 服务器A的数据库的user表 数据如下1 小明 男2 小红 女2 张三 男此时 进行 ...

  2. 根据twitter的snowflake算法生成唯一ID

    C#版本 /// <summary>/// 根据twitter的snowflake算法生成唯一ID/// snowflake算法 64 位/// 0---0000000000 000000 ...

  3. DefaultIdentifierGenerator 雪花算法 生成 重复 id 解决办法

    DefaultIdentifierGenerator 雪花算法 生成 重复 id 前言 问题发生 排查原因 问题解决 前言 利用 mybatisplus 的 DefaultIdentifierGene ...

  4. python 使用UUID库生成唯一ID

      首先导包: import uuid uuid1(): # make a UUID based on the host ID and current time     #  基于MAC地址,时间戳, ...

  5. 雪花算法之唯一ID生成器理解

    雪花算法基本情况 雪花算法是一个分布式的唯一ID生成器. 它应该具有高并发,以及高性能优点. 基于时间戳,ID具有有序性,同时分布式下机器间时间差异过大(类似同一台机器时间回拨,一定会重复),会导致重 ...

  6. 分布式下使用雪花算法生成全局ID及解决时钟回拨问题

    简介 雪花算法是 64 位 的二进制,一共包含了四部分: 1位是符号位,也就是最高位,始终是0,没有任何意义,因为要是唯一计算机二进制补码中就是负数,0才是正数 41位是时间戳,具体到毫秒,41位的二 ...

  7. 雪花算法生成分布式ID的时间回拨问题处理

    一般方法 1.直接抛异常 2.延迟等待到最新时间(需要回拨时间比较短) 3.采用历史最大时间 package com.zjq.javabasic.algorithm;/*** @description ...

  8. Python使用UUID库生成唯一ID

    资料:Python官方Doc:<20.15. uuid - UUID objects according to RFC 4122>UUID的算法介绍:<A Universally U ...

  9. 存数据返回他的序列号id_雪花般的分布式唯一ID雪花算法

    点击上方 Java老铁,并选择 设为星标 优质文章和资料会及时送达 导读:唯一ID可以标识数据的唯一性,在分布式系统中生成唯一ID的方案有很多,常见的方式大概有以下三种 依赖数据库,使用如MySQL自 ...

最新文章

  1. 国人的发明:鲁班语言
  2. 织梦首页html在哪儿,dedecms织梦首页去index.html
  3. javax.cache_新的Java缓存标准(javax.cache)
  4. lora终端连接云服务器_终端连接服务器主机
  5. C# MVC IOC、依赖注入
  6. ie8不兼容java项目_常见IE8兼容性问题及解决
  7. Recover刷机简介
  8. 百度研究院在硅谷新设两大实验室,三名AI科学家加盟
  9. nas服务器改成网站,nas配置web服务器
  10. java 单体 启动优化_java设计优化之单例模式
  11. 《python核心编程》学习笔记
  12. 未来教育二级MS Office无纸化考试模拟软件
  13. 图文详解VxLAN技术(二)
  14. 红米Note8手机图纸-电路原理图+主板元件位号图
  15. 角度逼近圆弧插补法插补与仿真
  16. java实现轮播图片_Banner框架实现图片轮播
  17. 常用crc查表法_请教查表法计算CRC的原理
  18. 日本风俗业数据_神奇宝贝如何融入日本民俗
  19. 7-15(查找) 航空公司VIP客户查询(25 分)
  20. 贪心背后的故事Codeforces 995B(Suit and Tie)

热门文章

  1. 《剑指offer》——矩阵中的路径
  2. 怎么用python画圆柱_python – 添加圆柱到绘图
  3. 计算机组成原理课程设计基本模型机,广东海洋大学计算机组成原理课程设计-基本模型机的设计与实现讲解...
  4. 本科阶段能在FPGA上做一个CPU并运行自己写的操作系统算什么水平?
  5. Poj·Picnic Planning
  6. 每日辣评:资讯类应用排名;OYO应当放缓扩张速度
  7. 别只用 Selenium,新神器 Pyppeteer 绕过淘宝更简单!
  8. MySQL与Postgres大不同 优步选择了前者
  9. 数据库地区表sql语句,数据库地区表包含省市县
  10. 水资源行业建设物联网有什么好处?