【算法】分布式ID神器之雪花算法简介

一、简介

在这里插入图片描述
在这里插入图片描述

二、优点

雪花算法,它至少有如下4个优点:

1.系统环境ID不重复
能满足高并发分布式系统环境ID不重复,比如大家熟知的分布式场景下的数据库表的ID生成。

2.生成效率极高
在高并发,以及分布式环境下,除了生成不重复 id,每秒可生成百万个不重复 id,生成效率极高。

3.保证基本有序递增
基于时间戳,可以保证基本有序递增,很多业务场景都有这个需求。

4.不依赖第三方库
不依赖第三方的库,或者中间件,算法简单,在内存中进行。

三、缺点

依赖服务器时间,服务器时钟回拨时可能会生成重复 id。

四、python 实现

以下示例中,SnowflakeGenerator类代表了一个雪花ID生成器。它使用当前时间戳、工作节点ID和数据中心ID来生成唯一的雪花ID。generate_id方法用于生成ID,它会根据时间戳、序列号和各个ID部分进行位运算,生成最终的64位雪花ID。

请注意,这只是一个简化的示例,实际应用中可能需要根据具体情况进行调整和扩展,例如添加容错处理、分布式部署等。另外,Snowflake算法在分布式环境中可以使用不同的节点ID和数据中心ID来确保生成的ID的唯一性。

import time

class SnowflakeGenerator:
    def __init__(self, worker_id, datacenter_id):
        self.worker_id = worker_id
        self.datacenter_id = datacenter_id
        self.sequence = 0
        self.last_timestamp = -1

    def generate_id(self):
        timestamp = int(time.time() * 1000)

        if timestamp < self.last_timestamp:
            raise Exception("Invalid system clock!")

        if timestamp == self.last_timestamp:
            self.sequence = (self.sequence + 1) & 4095
            if self.sequence == 0:
                timestamp = self.wait_next_millisecond(self.last_timestamp)
        else:
            self.sequence = 0

        self.last_timestamp = timestamp

        snowflake_id = (
            ((timestamp - 1609459200000) & 0x3FFFFFFFFFF) << 22
            | (self.datacenter_id & 0x1F) << 17
            | (self.worker_id & 0x1F) << 12
            | (self.sequence & 0xFFF)
        )

        return snowflake_id

    def wait_next_millisecond(self, last_timestamp):
        timestamp = int(time.time() * 1000)
        while timestamp <= last_timestamp:
            timestamp = int(time.time() * 1000)
        return timestamp

# 示例用法
generator = SnowflakeGenerator(worker_id=0, datacenter_id=0)
snowflake_id = generator.generate_id()
print(snowflake_id)

五、竞品分析

分布式ID的常见解决方案
1、UUID
Java自带的生成一串唯一随机36位字符串(32个字符串+4个“-”)的算法。它可以保证唯一性,且据说够用N亿年,但是其业务可读性差,无法有序递增。

2、SnowFlake
今天的主角雪花算法,它是Twitter开源的由64位整数组成分布式ID,性能较高,并且在单机上递增。

3、UidGenerator
UidGenerator是百度开源的分布式ID生成器,其基于雪花算法实现。

4、Leaf
Leaf是美团开源的分布式ID生成器,能保证全局唯一,趋势递增,但需要依赖关系数据库、Zookeeper等中间件。

六、使用场景

生成设备的唯一ID

七、一些趣事

在这里插入图片描述

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值