雪花算法-Python
Django
Snowflake逻辑
雪花算法生成64位的二进制正整数,然后转换成10进制的数。
- 1位标识符:始终是0
- 41位时间戳:41位时间戳不是存储当前时间的时间戳,而是存储时间截的差值(当前时间截 - 开始时间截 )得到的值,这里的的开始时间截,一般是我们的id生成器开始使用的时间,由我们程序来指定的
- 10位机器标识码:可以部署在1024个节点,如果机器分机房(IDC)部署,这10位可以由 5位机房ID + 5位机器ID 组成
- 12位序列:毫秒内的计数,12位的计数顺序号支持每个节点每毫秒(同一机器,同一时间截)产生4096个ID序号
库
一个为python提供雪花功能的库,包括客户端和服务器pysnowflake
pip3 install pysnowflake
终端执行
snowflake_start_server
[--dc=DC_ID]
[--worker=WORKER_ID]
[--host=ADDRESS] # 默认localhost
[--port=PORT] # 默认端口8910
# 例子
snowflake_start_server --worker=1
使用
import snowflake.client
>>> snowflake.client.get_guid()
4379917420152754177
>>> snowflake.client.get_stats() # 查看当前节点信息
{
'dc': 0,
'worker': 1,
'timestamp': 1594535313132,
'last_timestamp': 1594535287895,
'sequence': 1,
'sequence_overload': 0,
'errors': 0
}
指定相关节点初始化
import snowflake.client
host = '127.0.0.1'
port = 30001
snowflake.client.setup(host, port)
...
查看|检验
>>> snowflake.client.get_guid()
4379917420152754177
>>> bin(4379917420152754177)
'0b11110011001000100101111011000000010101110000000001000000000001'
0 (+1)
1111001100100010010111101100000001010111 (+41)
0000000001 (+10)
000000000001 (+12)
1111001100100010011001100000111100011100
1111001100100010011001100001000110011010
1111001100100010011001100001010100000111