首页 > 编程语言 >雪花算法

雪花算法

时间:2024-06-07 20:56:02浏览次数:27  
标签:sequence timestamp self worker 雪花 ID 算法 id

SnowFlake

雪花算法概述

雪花算法是由 Twitter 开发的一种分布式唯一 ID 生成算法,主要用于分布式系统中需要生成唯一 ID 的场景。它生成的 ID 既有全局唯一性,又有时间有序性。

雪花算法 ID 结构

一个典型的雪花算法生成的 ID 一共有 64 位,通常由以下几个部分组成:

  1. 1 位符号位:永远是 0,表示正数。
  2. 41 位时间戳:表示从一个固定时间点(通常是某个纪元时间,比如 2020-01-01 00:00:00)开始经过的毫秒数。这部分可以使用大约 69 年的时间。
  3. 10 位机器 ID:用来表示不同的机器或节点,可以支持最多 1024 个节点。
  4. 12 位序列号:用来表示同一毫秒内产生的不同 ID,每毫秒内可以生成 4096 个不同的 ID。

雪花算法详细实现

以下是使用 Python 实现雪花算法的详细步骤:

1. 导入必要模块

import time

2. 定义 Snowflake

class Snowflake:
    def __init__(self, datacenter_id, worker_id, sequence=0):
        self.datacenter_id = datacenter_id
        self.worker_id = worker_id
        self.sequence = sequence
  • datacenter_id:数据中心 ID,表示不同的数据中心。
  • worker_id:机器 ID,表示不同的机器或节点。
  • sequence:序列号,初始化为 0。

3. 定义常量

        self.epoch = 1577836800000  # 固定的时间戳,比如 2020-01-01 00:00:00
        self.datacenter_id_bits = 5
        self.worker_id_bits = 5
        self.sequence_bits = 12
  • epoch:纪元时间,即一个固定的时间点,从这个时间点开始计算经过的毫秒数。
  • datacenter_id_bits:数据中心 ID 的位数,设为 5 位。
  • worker_id_bits:机器 ID 的位数,设为 5 位。
  • sequence_bits:序列号的位数,设为 12 位。

4. 计算最大值

        self.max_datacenter_id = -1 ^ (-1 << self.datacenter_id_bits)
        self.max_worker_id = -1 ^ (-1 << self.worker_id_bits)
        self.max_sequence = -1 ^ (-1 << self.sequence_bits)
  • max_datacenter_id:数据中心 ID 的最大值。
  • max_worker_id:机器 ID 的最大值。
  • max_sequence:序列号的最大值。

5. 定义移位数

        self.worker_id_shift = self.sequence_bits
        self.datacenter_id_shift = self.sequence_bits + self.worker_id_bits
        self.timestamp_left_shift = self.sequence_bits + self.worker_id_bits + self.datacenter_id_bits
  • worker_id_shift:机器 ID 的移位数。
  • datacenter_id_shift:数据中心 ID 的移位数。
  • timestamp_left_shift:时间戳的移位数。

6. 定义时间戳获取方法

def _gen_timestamp(self):
    return int(time.time() * 1000)
  • _gen_timestamp:获取当前时间戳,单位为毫秒。

7. 定义等待方法

    def _wait_for_next_millis(self, last_timestamp):
        timestamp = self._gen_timestamp()
        while timestamp <= last_timestamp:
            timestamp = self._gen_timestamp()
        return timestamp
  • _wait_for_next_millis:等待到下一毫秒,确保时间戳唯一性。

8. 生成唯一 ID

    def next_id(self):
        timestamp = self._gen_timestamp()

        if timestamp < self.last_timestamp:
            raise Exception("Clock is moving backwards. Rejecting requests until %d." % self.last_timestamp)

        if self.last_timestamp == timestamp:
            self.sequence = (self.sequence + 1) & self.max_sequence
            if self.sequence == 0:
                timestamp = self._wait_for_next_millis(self.last_timestamp)
        else:
            self.sequence = 0

        self.last_timestamp = timestamp

        return ((timestamp - self.epoch) << self.timestamp_left_shift) | \
               (self.datacenter_id << self.datacenter_id_shift) | \
               (self.worker_id << self.worker_id_shift) | \
               self.sequence
  • next_id:生成唯一 ID 的方法。
    • 获取当前时间戳。
    • 如果当前时间戳小于上一个时间戳,抛出异常。
    • 如果当前时间戳等于上一个时间戳,增加序列号,并检查是否溢出。如果溢出,等待到下一毫秒。
    • 否则,重置序列号为 0。
    • 更新上一个时间戳。
    • 通过位移操作生成唯一 ID。

使用示例

# 示例使用
datacenter_id = 1  # 数据中心 ID
worker_id = 1      # 机器 ID
snowflake = Snowflake(datacenter_id, worker_id)

for _ in range(10):
    print(snowflake.next_id())
  • 初始化 Snowflake 类实例,传入数据中心 ID 和机器 ID。
  • 调用 next_id 方法生成唯一 ID。

要点

  1. 雪花算法的用途:生成分布式唯一 ID。
  2. ID 结构
    • 1 位符号位:永远为 0。
    • 41 位时间戳:从固定时间点开始的毫秒数。
    • 10 位机器 ID:表示不同机器或节点。
    • 12 位序列号:同一毫秒内产生的不同 ID。
  3. 实现步骤
    • 导入 time 模块。
    • 定义 Snowflake 类,初始化参数。
    • 定义常量:纪元时间、各部分的位数。
    • 计算最大值:数据中心 ID、机器 ID、序列号。
    • 定义移位数:机器 ID 移位数、数据中心 ID 移位数、时间戳移位数。
    • 获取当前时间戳的方法 _gen_timestamp
    • 等待到下一毫秒的方法 _wait_for_next_millis
    • 生成唯一 ID 的方法 next_id
  4. 使用示例:初始化 Snowflake 实例,生成唯一 ID。

第三方包

https://blog.csdn.net/m0_61970162/article/details/126474140

安装

pip install pysnowflake

启动服务

snowflake_start_server --worker=1

编写程序,获取id

from snowflake import client

print(client.get_guid())  # 4896771064513695745

标签:sequence,timestamp,self,worker,雪花,ID,算法,id
From: https://www.cnblogs.com/ssrheart/p/18237841

相关文章

  • [自适应控制] 广义最小方差控制(GMVC)算法理论及其Matlab实现
     基于[自适应控制],广义最小方差控制(GMVC)算法理论与其Matlab实现,包括代码和参考书籍,适合新手学习,注释清晰,适合入门或者进行二创。模型获取:[自适应控制]广义最小方差控制(GMVC)算法理论及其Matlab实现......
  • [自适应控制] 最小方差控制(MVC)算法理论,及其 Matlab代码 实现
      个人整理了[自适应控制]最小方差控制(MVC)算法理论,并使用Matlab代码进行了实现,效果明显,配备了参考文献与书籍,适合新手学习使用。模型代码获取:  [自适应控制]最小方差控制(MVC)算法理论,及其Matlab代码实现......
  • 数据结构学习笔记-佛洛依德算法
    最短路径问题的经典解法-佛洛依德算法问题描述:设计算法求解图的最短路径【算法设计思想】初始化距离矩阵:首先,将解决方案矩阵dist[][]初始化为输入图矩阵graph[][],这个矩阵存储了顶点之间的直接距离或者权值。中间顶点迭代:然后,对每一个顶点作为中间顶点进行迭代。算法通过......
  • 算法题-无重复字符的最长子串
    学习目标:无重复字符的最长子串leetcode原题链接学习内容:给定一个字符串s,请你找出其中不含有重复字符的最长连续子字符串的长度。示例1:输入:s=“abcabcbb”输出:3解释:因为无重复字符的最长子字符串是“abc”,所以其长度为3。示例2:输入:s=“......
  • 代码随想录算法训练营第30天|回溯复习篇
    回溯基础理论1.回溯的本质是利用递归进行暴力搜索,将符和条件的结果集搜索出来2.回溯法常见的问题:组合问题:N个数里面按一定规则找出k个数的集合排列问题:N个数按一定规则全排列,有几种排列方式切割问题:一个字符串按一定规则有几种切割方式子集问题:一个N个数的集合里有多少符合......
  • 机器学习--有监督学习--算法整理
     整理原因:为了更好的理解学习算法为什么有用,还是决定认真看看推导公式和过程。以下是有监督学习线性回归的推导过程。算法目标:根据一组x和y的对应关系,找到他们的线性关系,得到拟合线性方程:y=ax+b,从而对于任意的自变量x,都可以预测到对应的因变量y的值。并且,要保证这个a,b足够可靠......
  • 机器学习-聚类算法
    1.有监督学习与无监督学习有监督:在训练集中给的数据中有X和Y,根据这些数据训练出一组参数对预测集进行预测无监督:在训练集中给的数据只有X没有Y,根据X数据找相似度参数来对预测集进行预测2.数据间的相似度2.1距离相似度:每一条数据可以理解为一个n维空间中的点,可以根据点点之......
  • 代码随想录算法训练营第三十天 | 51.N 皇后
    51.N皇后题目链接文章讲解视频讲解递归三部曲递归函数参数需要传入当前chessBoard和棋盘大小n,以及当前要放置皇后的行数rowvoidbacktracking(vector<string>&chessBoard,intn,introw);递归终止条件当最后一个皇后放置好后结束if(row==n){result.push_b......
  • 安防监控平台智能边缘分析一体机视频监控系统室内消防通道占用检测算法
    随着城市化进程的加速,高层建筑如雨后春笋般涌现。这些建筑的消防安全问题日益凸显,尤其是消防通道的占用问题。为了解决这一问题,智能边缘分析一体机被引入到室内消防通道占用检测中,以提高检测效率和准确性。本文将探讨这一技术的应用及其重要性。智能边缘分析一体机是一种集成......
  • 开山之作!Python数据与算法分析手册,登顶GitHub!
    若把编写代码比作行军打仗,那么要想称霸沙场,不能仅靠手中的利刃,还需深谙兵法。Python是一把利刃,数据结构与算法则是兵法。只有熟读兵法,才能使利刃所向披靡。只有洞彻数据结构与算法,才能真正精通Python。今天给小伙伴们分享的这份手册,是用Python描述数据结构与算法的开山之作,......