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 dotimestamp = get_current_time()endreturn timestamp
end-- 生成雪花ID
local function next_id()local timestamp = get_current_time()-- 处理时钟回拨问题if timestamp < last_timestamp thenerror("Clock moved backwards. Refusing to generate id for " .. (last_timestamp - timestamp) .. " milliseconds")endif timestamp == last_timestamp thensequence = (sequence + 1) & MAX_SEQUENCEif sequence == 0 thentimestamp = wait_for_next_millisecond(last_timestamp)endelsesequence = 0endlast_timestamp = timestamp-- 计算时间戳部分local timestamp_left_shift = MACHINE_ID_BITS + SEQUENCE_BITSlocal timestamp_part = ((timestamp - EPOCH) << timestamp_left_shift)-- 计算机器ID部分local machine_id_shift = SEQUENCE_BITSlocal machine_id_part = (machine_id << machine_id_shift)-- 组合生成IDlocal id = timestamp_part | machine_id_part | sequencereturn id
end

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/472761.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

27-压力测试

测试目标 & 测试数据 ● 测试目标 ○ 测试集群的读写性能 / 做集群容量规划 ○ 对 ES 配置参数进行修改&#xff0c;评估优化效果 ○ 修改 Mapping 和 Setting&#xff0c;对数据建模进行优化&#xff0c;并测试评估性能改进 ○ 测试 ES 新版本&#xff0c;结合实际场…

单元测试、集成测试、系统测试、验收测试、压力测试、性能测试、安全性测试、兼容性测试、回归测试(超详细的分类介绍及教学)

目录 1.单元测试 实现单元测试的方法&#xff1a; 注意事项&#xff1a; 2.集成测试 需注意事项&#xff1a; 实现集成测试的方法&#xff1a; 如何实现高效且可靠的集成测试&#xff1a; 3.系统测试 实现系统测试的方法: 须知注意事项&#xff1a; 4.验收测试 实现验…

vxe-grid table 校验指定行单元格的字段,只校验某个列的字段

Vxe UI vue vxe-table 中校验表格行是非常简单的&#xff0c;只需要配置好校验规则&#xff0c;然后调用 validate 方法就可以自动完成校验&#xff0c;但是由于项目淡色特殊需求&#xff0c;在某个单元格的值修改后需要对另一个列的值就行校验&#xff0c;这个时候又不需要全部…

网络基础(4)传输层

既然是传输层首先就要明确实在层状结构的哪里,除开物理层之外分成了四层协议: 到这里上层(应用层)的使用已经没有问题&#xff0c;之前使用的套接字都是在应用层的。 再说端口号 到一个主机收到一个报文的时候&#xff0c;这个报文中一定存在这个报文需要到的主机的ip号。如果…

如何利用WebSockets实现高效的实时通信应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 如何利用WebSockets实现高效的实时通信应用 如何利用WebSockets实现高效的实时通信应用 如何利用WebSockets实现高效的实时通信应…

stm32——通用定时器时钟知识点

&#xff08;该图来自小破站 铁头山羊老师的stm32标准库教学&#xff09;

Excel使用-弹窗“此工作簿包含到一个或多个可能不安全的外部源的链接”的发生与处理

文章目录 前言一、探讨问题发生原因1.引入外部公式2.引入外部数据验证二、问题现象排查及解决1.排查公式2.排查数据验证3.特殊处理方式总结前言 作为一种常用的办公软件,Excel被大家所熟知。尽管使用了多年,有时候在使用Excel时候也会发生一些不太常见的现象,需要用心核查下…

Spring中的Bean

Spring中的Bean 目录&#xff1a; 一、Bean的配置 二、Bean的实例化 三、Bean的作用域 四、Bean的装配方式 一、Bean的配置 1.IoC 容器 ​ Spring容器会负责控制程序之间的关系&#xff0c;而不是由程序代码直接控制&#xff0c;这样控制权由应用代码转移到了外部容器&…

无效的目标发行版17和无法连接Maven进程问题

起因&#xff1a;我clean了一个模块的Maven想要重新下&#xff0c;他就开始报错。两次了都是这样。如果和我一样一开始都是好好的&#xff0c;直接找Maven的设置&#xff0c;在运行程序改&#xff0c;jre变成了11.它自己变成了我其他的jdk

猎板PCB罗杰斯板材的应用案例

以下是几个猎板 PCB 与罗杰斯板材结合的具体案例&#xff1a; 案例一&#xff1a;5G 通信基站天线 PCB 在 5G 通信基站的天线系统中&#xff0c;对高频信号的传输和处理要求极高。猎板 PCB 采用罗杰斯板材&#xff0c;凭借其稳定的低介电常数&#xff08;如 RO4003C 板材&…

ollama+springboot ai+vue+elementUI整合

1. 下载安装ollama (1) 官网下载地址&#xff1a;https://github.com/ollama/ollama 这里以window版本为主&#xff0c;下载链接为&#xff1a;https://ollama.com/download/OllamaSetup.exe。 安装完毕后&#xff0c;桌面小图标有一个小图标&#xff0c;表示已安装成功&…

零基础利用实战项目学会Pytorch

目录 pytorch简介 1.线性回归 2.数据类型 2.1数据类型检验 2.2Dimension0/Rank0 2.3 Dim1/Rank1 2.4 Dim2/Rank2 3.一些方法 4.Pytorch完成分类任务 4.1模型参数 4.2 前向传播 4.3训练以及验证 4.4 三行搞定&#xff01; 4.5 准确率 5、Pytorch完成回归任务 5.…

大数据实验9:Spark安装和编程实践

实验九&#xff1a;Spark基础编程1 一、实验目的 通过实验掌握基本的Spark编程方法&#xff1b;掌握用Spark解决一些基本的数据处理和统计分析&#xff0c;去重、排序等&#xff1b; 二、实验要求 掌握Spark相关shell命令的使用&#xff1b;完成下面的实验内容&#xff0c;…

vue3 element el-table实现表格动态增加/删除/编辑表格行,带有校验规则

需求描述 在项目中遇到需要实现表格动态的新增、编辑、删除表格行的需求&#xff0c;同时带有校验规则 代码解决 点击新增的时候&#xff0c;给新增row默认属性&#xff0c;给相应的默认值&#xff0c;包括给一个isEditor: true&#xff0c;用来区分是否需要编辑。同时当有编…

Redis下载历史版本

Linux版本&#xff1a; https://download.redis.io/releases/ Windows版本&#xff1a; https://github.com/tporadowski/redis/releases Linux Redis对应gcc版本

初识ElasticSearch

一、了解ES 1.1 什么是 ElasticSearch 1、ElasticSearch 是一款非常强大的开源搜索引擎&#xff0c;可以帮助我们从海量的数据中快速的找到需要的内容。 2、ElasticSearch 结合 Kibana、Logstash、Beats、也就是Elastic Stach&#xff08;ELK&#xff09;。被广泛应用在日志数…

【大数据学习 | HBASE高级】hbase-phoenix 与二次索引应用

1. hbase-phoenix的应用 1.1 概述&#xff1a; 上面我们学会了hbase的操作和原理&#xff0c;以及外部集成的mr的计算方式&#xff0c;但是我们在使用hbase的时候&#xff0c;有的时候我们要直接操作hbase做部分数据的查询和插入&#xff0c;这种原生的方式操作在工作过程中还…

Redis在高性能缓存中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 Redis在高性能缓存中的应用 Redis在高性能缓存中的应用 Redis在高性能缓存中的应用 引言 Redis 概述 定义与原理 发展历程 Redi…

MySQL初学之旅(3)约束

目录 1.前言 2.正文 2.1约束类型 2.2NULL约束 2.3UNIQUE约束 2.4DEFAULT约束 2.5PRIMARY KEY主键约束 2.6FOREIGN KEY外键约束 2.7CHECK约束 3.小结 1.前言 哈喽大家好啊&#xff0c;今儿来继续给大家分享最近学习的MySQL和约束相关的知识点&#xff0c;希望大家一起…

RHCE的学习(20)

变量5种赋值方式 shell中变量赋值5种方式&#xff0c;其中采用name10的方法称A 直接赋值 nameB read命令 read v1C 使用命令行参数 &#xff08;$1 $2 $3 ..&#xff09; name$1D 使用命令的输入 username$(whoami)E 从文件读取 #cut -d : -f1 /etc/passwd > /user.listfor…