lua实现雪花算法

lua实现雪花算法

雪花算法介绍

雪花算法(Snowflake Algorithm)是一种用于生成唯一ID的分布式生成算法,最初由Twitter开发。它的主要目的是在分布式系统中生成唯一的、时间有序的ID,这些ID通常用于数据库的主键或在分布式系统中的各种唯一标识符,雪花算法被广泛应用于各种需要生成唯一ID的场景,如分布式数据库、消息队列、分布式缓存系统等

雪花算法生成的ID是一个64位的整数,通常表示为:

41 bits: 时间戳(毫秒级)

10 bits: 机器ID

12 bits: 序列号

组成部分

  1. 时间戳(41 bits):
  • 记录了从某个特定时间(通常是系统启动或某个固定时间点)以来的毫秒数
  • 41位的时间戳可以支持大约69年的时间范围
  1. 机器ID(10 bits):
  • 用于标识生成ID的机器
  • 10位可以标识1024台不同的机器
  1. 序列号(12 bits):
  • 在同一毫秒内生成的多个ID时,用于区分这些ID
  • 12位可以支持每毫秒最多生成4096个唯一的ID

优点

  • 唯一性:通过组合时间戳、机器ID和序列号,确保生成的ID在分布式系统中是唯一的
  • 时间有序:ID是按时间顺序生成的,方便排序和查询
  • 高效:生成ID的过程只需要进行简单的位运算,非常高效

缺点

  • 时钟同步问题:如果系统时钟回拨,可能会导致ID冲突。通常需要处理时钟回拨的问题
  • 机器ID分配:需要确保每台机器的ID是唯一的

代码示例

lua 复制代码
-- 定义常量
-- local TIMESTAMP_BITS = 41
local MACHINE_ID_BITS = 10
local SEQUENCE_BITS = 12

-- 时间戳起始时间(毫秒),例如从2020-01-01 00:00:00开始
local EPOCH = 1577836800000

-- 计算掩码
-- local MAX_MACHINE_ID = (1 << MACHINE_ID_BITS) - 1
local MAX_SEQUENCE = (1 << SEQUENCE_BITS) - 1

-- 机器ID(0到1023之间)
local machine_id = 123

-- 序列号
local sequence = 0
local last_timestamp = -1

-- 获取当前时间戳(毫秒)
local function get_current_time()
    return os.time() * 1000
end

-- 等待下一毫秒
local function wait_for_next_millisecond(last_timestamp)
    local timestamp = get_current_time()
    while timestamp <= last_timestamp do
        timestamp = get_current_time()
    end
    return timestamp
end

-- 生成雪花ID
local function next_id()
    local timestamp = get_current_time()

    -- 处理时钟回拨问题
    if timestamp < last_timestamp then
        error("Clock moved backwards. Refusing to generate id for " .. (last_timestamp - timestamp) .. " milliseconds")
    end

    if timestamp == last_timestamp then
        sequence = (sequence + 1) & MAX_SEQUENCE
        if sequence == 0 then
            timestamp = wait_for_next_millisecond(last_timestamp)
        end
    else
        sequence = 0
    end

    last_timestamp = timestamp

    -- 计算时间戳部分
    local timestamp_left_shift = MACHINE_ID_BITS + SEQUENCE_BITS
    local timestamp_part = ((timestamp - EPOCH) << timestamp_left_shift)

    -- 计算机器ID部分
    local machine_id_shift = SEQUENCE_BITS
    local machine_id_part = (machine_id << machine_id_shift)

    -- 组合生成ID
    local id = timestamp_part | machine_id_part | sequence

    return id
end
相关推荐
wabs66613 小时前
关于贪心算法的思考
算法·贪心算法
社交怪人13 小时前
【判断大小】信息学奥赛一本通C语言解法(题号1043)
算法
lengxuemo13 小时前
ICC2学习笔记之Placement and Optimization
笔记·学习
Snasph13 小时前
GNU Make 用户手册(中文版)
服务器·算法·gnu
江澎涌14 小时前
拆解与 AI 的一次对话
人工智能·算法·程序员
sheeta199814 小时前
LeetCode 每日一题笔记 日期:2026.06.02 题目:3635. 最早完成陆地和水上游乐设施的时间 II
笔记·算法·leetcode
Lsk_Smion14 小时前
力扣实训 _ [102].层序遍历--前序--后续_递归与非递归的实现
数据结构·算法·leetcode
小满Autumn15 小时前
MVVM Light 架构笔记:定位器、命令、消息与 IoC 实践
笔记·学习·架构·c#·上位机·mvvm
小欣加油16 小时前
leetcode3751 范围内总波动值I
java·数据结构·c++·算法·leetcode
代码中介商16 小时前
C++左值与右值:核心判断法则详解
开发语言·c++