Javascript is required
雪花算法-Python

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