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

雪花算法

时间:2024-07-04 23:22:05浏览次数:18  
标签:timestamp self 雪花 毫秒 算法 id

雪花算法

1.1 概述

雪花算法是twitter开源的一个分布式id的生成算法。雪花id,是分布式计算中使用的唯一标识符的一种形式。该格式由twitter创建。人们普遍认为,每片雪花都有唯一的结构,因此他们取了“雪花ID”这个名字。

1.2 什么是雪花id

雪花id是有一种分布式id算法生成的,他的设计目标是在分布式系统中生成唯一id,具有趋势递增,高性能,可拓展的特点,它可以分为四个部分。

  • 1 符号位:符号位,也就是最高位,始终是0,没有任何意义,因为要是唯一计算机二进制补码中就是负数,0才是正数。
  • 2 时间戳:占用41位,记录生成ID的时间戳,精确到毫秒级。
  • 3 机器标识:占用10位,用于标识不同的机器。
  • 4 计数序列号:占用12位,用于解决同一毫秒内生成多个ID的冲突。

1

1.3 python实现

import time


class Snowflake:
    def __init__(self, machine_id):
        # 当前的唯一机器码
        self.machine_id = machine_id
        # 用于初始和重置序列号
        self.sequence = 0
        # 不存在的时间戳,用于第一次生成id
        self.last_timestamp = -1

    def _get_timestamp(self):
        # 获取当前时间戳(毫秒)
        return int(time.time() * 1000)

    # 等带下一毫秒
    def _til_next_millis(self, last_timestamp):
        timestamp = self._get_timestamp()
        while timestamp <= last_timestamp:
            timestamp = self._get_timestamp()
        return timestamp

    def generate_id(self):
        timestamp = self._get_timestamp()
        # 检测时钟是否回拨
        if timestamp < self.last_timestamp:
            raise Exception("Clock moved backwards. Refusing to generate ID.")
        if timestamp == self.last_timestamp:
            # 如果时间戳相同,序列号递增
            self.sequence = (self.sequence + 1) & 4095
            if self.sequence == 0:
                timestamp = self._til_next_millis(self.last_timestamp)
        else:
            # 如果不相同,则重置序列号
            self.sequence = 0
        self.last_timestamp = timestamp
        snowflake_id = ((timestamp - 1288834974657) << 22) | (self.machine_id << 12) | self.sequence
        return snowflake_id


if __name__ == "__main__":
    snowflake = Snowflake(machine_id=1)
    for _ in range(10):
        print(snowflake.generate_id())

标签:timestamp,self,雪花,毫秒,算法,id
From: https://www.cnblogs.com/Hqqqq/p/18284876

相关文章

  • 代码随想录算法训练营第五十天 | 1143.最长公共子序列 392.判断子序列
    1143.最长公共子序列题目链接文章讲解视频讲解dp[i][j]:表示以text1以i-1为结尾text2以j-1为结尾的最长公共子序列为dp[i][j]递推公式:如果text1[i-1]==text2[j-1]那么dp[i][j]=dp[i-1][j-1]+1;  如果不相同的话,那么dp[i][j]=max(dp[i-1][j],dp[i][j-1]);cl......
  • 算法入门(3) 7.4
    [NOIP1998普及组]三连击题目背景本题为提交答案题,您可以写程序或手算在本机上算出答案后,直接提交答案文本,也可提交答案生成程序。题目描述将$1,2,\ldots,9$共$9$个数分成$3$组,分别组成$3$个三位数,且使这$3$个三位数构成$1:2:3$的比例,试求出所有满足条件......
  • 代码随想录算法训练营第四十九天 | 300.最长递增子序列
    300.最长递增子序列题目链接文章讲解视频讲解动规五部曲:dp[i]:表示考虑元素i的最长子序列为dp[i]递推公式:dp[i]=max(dp[j]+1,dp[i]);初始化:dp[i]=1;每个元素单独算一个子序列长度为1遍历顺序:从前向后遍历打印dp数组classSolution{public:intlength......
  • 每日一道算法题 判断子序列
    题目判断子序列_牛客题霸_牛客网(nowcoder.com)Python##代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可###@paramSstring字符串#@paramTstring字符串#@returnbool布尔型#classSolution:defisSubsequence(self,S:str......
  • 每日一道算法题 称砝码
    题目称砝码_牛客题霸_牛客网(nowcoder.com)Pythonn=int(input())weight=list(map(int,input().split()))count=list(map(int,input().split()))w_li=[]for_inrange(n):foriinrange(count[_]):w_li.append(weight[_])ans={0}forwinw_li:......
  • Python基于PyQt5和卷积神经网络分类模型(ResNet50分类算法)实现生活垃圾分类系统GUI界
    说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取。1.项目背景在当今社会,随着人们对环境保护意识的增强以及科技的快速发展,智能化的垃圾分类系统成为了一个热门的研究方向。结合深度学习技术,尤其是先进的图像识......
  • 常见加密解密算法及其在 PHP 中的实现
    加密和解密算法在信息安全中起着至关重要的作用。以下是一些常见的加密和解密算法,包括对称加密、非对称加密和哈希算法。对称加密算法对称加密算法使用相同的密钥进行加密和解密。常见的对称加密算法包括:AES(AdvancedEncryptionStandard):AES是一种广泛使用的对称加密算法,支......
  • 「代码随想录算法训练营」第二天 | 数组 part2
    977.有序数组的平方题目建议:本题关键在于理解双指针思想题目链接:https://leetcode.cn/problems/squares-of-a-sorted-array/题目难度:简单文章讲解:https://programmercarl.com/0977.有序数组的平方.html视频讲解:https://www.bilibili.com/video/BV1QB4y1D7ep题目状态:通过......
  • 通过SVM算法使失衡数据达到最佳性能
      目录1.读取数据并预处理2.下采样3.数据切分4.使用SVM算法5.测试6.绘制AUC-ROC曲线 本代码所使用的数据集中,标签为1的数据仅有五千多条,而标签为0的数据有二十八万条。为了使数据集中我们最关注的标签1的预测成功的概率,即1的召回率尽量更高,本代码将采用SVM算法提......
  • 聚类算法与实现
    “物以类聚,人以群分”,所谓的聚类,就是将样本划分为由类似的对象组成的多个类的过程。聚类后,我们可以更加准确的在每个类中单独使用统计模型进行估计、分析或预测;也可以探究不同类之间的相关性和主要差异。聚类和上一讲分类的区别:分类是已知类别的,聚类未知。对于K-means算法与层......