当前位置: 首页 > article >正文

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是唯一的

代码示例

-- 定义常量
-- 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

http://www.kler.cn/a/398019.html

相关文章:

  • 【弱监督视频异常检测】2024-ESWA-基于扩散的弱监督视频异常检测常态预训练
  • c# 调用c++ 的dll 出现找不到函数入口点
  • Redis五大基本类型——String字符串命令详解(命令用法详解+思维导图详解)
  • MacOS下,如何在Safari浏览器中打开或关闭页面中的图片文字翻译功能
  • 微服务链路追踪skywalking安装
  • shell编程--永久环境变量和字符串显位
  • 大数据中的时序数据,以及时序数据架构设计解决方案
  • 2024年最后一期数字孪生专项学习!!
  • Android Framework AMS(14)ContentProvider分析-1(CP组件应用及开机启动注册流程解读)
  • Ceph的pool有两种类型
  • 【基础算法】栈
  • 对链表进行插入排序
  • 2024年11月16日Github流行趋势
  • 基于opencv制作GUI界面
  • wsl2配置文件.wslconfig不生效
  • 华为Mate 70临近上市:代理IP与抢购攻略
  • 10款PDF合并工具的使用体验与推荐!!
  • UE5材质篇 3 MaterialFunction
  • Jupyter Book 快捷键总结大全
  • Win11 安装与配置 Java环境 JDK(以JDK11为例)
  • MinIO 的 S3 over RDMA 计划: 为高速人工智能数据基础设施设定对象存储新标准
  • 永磁电机的前生今世和未来?
  • 20241116解决在WIN11和ubuntu20.04通过samba共享时出现局域网千兆带宽拉满的情况
  • android studio新建activity提示 require androidX support
  • 2.操作系统常见面试问题3
  • 【安全通信】告别信息泄露:搭建你的开源视频聊天系统briefing