golang 实现雪花算法

news2025/7/28 3:20:01

雪花算法概述

snowflake 是 twitter 开源的分布式ID生成算法,其核心思想为,一个long型的ID:

  • 41 bit 作为毫秒数 - 41位的长度可以使用69年
  • 10 bit 作为机器编号 (5个bit是数据中心,5个bit的机器ID) - 10位的长度最多支持部署1024个节点
  • 12 bit 作为毫秒内序列号 - 12位的计数顺序号支持每个节点每毫秒产生4096个ID序号

雪花算法原理

代码实现

package main

import (
	"fmt"
	"sync"
	"time"
)

// 服务上线时间毫秒时间戳
const startTime = 1698734492000

// SnowflakeId组成:timestamps[41bits]  workId[10bits] seqId[12bits]
type snowflakeIdWorker struct {
	sync.Mutex
	workId   int //[0,1024)
	lastTms  int64
	seqInTms int //[0,4096)
}

func NewSnowflakeIdWorker(workId int) *snowflakeIdWorker {
	return &snowflakeIdWorker{
		Mutex:    sync.Mutex{},
		workId:   workId,
		lastTms:  0,
		seqInTms: 0,
	}
}

func (p *snowflakeIdWorker) GetUUID() int64 {
	p.Lock()
	defer p.Unlock()

	nowTms := time.Now().UnixNano() / 1e6
	if nowTms == p.lastTms {
		p.seqInTms = (p.seqInTms + 1) & (1<<12 - 1)
		if p.seqInTms == 0 {
			for nowTms == p.lastTms {
				nowTms = time.Now().UnixNano() / 1e6
			}
		}
	} else {
		p.seqInTms = 4090
		p.lastTms = nowTms
	}
	return (nowTms - startTime)<<22 | int64(p.workId)<<12 | int64(p.seqInTms)
}

func main() {
	worker := NewSnowflakeIdWorker(1)
	for i := 0; i < 10000; i++ {
		a := worker.GetUUID()
		b := fmt.Sprintf("%b", a)
		fmt.Println("a", a, "b", b, "len(b):", len(b))
	}
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二叉树OJ题(检查两颗数是否相同、另一棵树的子树、翻转二叉树、判断平衡二叉树)

文章目录 二叉树OJ题一、 检查两颗数是否相同1.思路2.解题步骤3.代码 二、另一棵树的子树1.思路2.代码 三、翻转二叉树1.思路2.解题步骤3.代码 四、判断平衡二叉树1.思路2.代码 二叉树OJ题 一、 检查两颗数是否相同 1.思路 1.两个树&#xff0c;在保证结构相同的同时&#xff0…

语音信号处理给音乐信号增加房间混响效果

语音信号处理给音乐信号增加房间混响效果 是否需要申请加入数字音频系统研究开发交流答疑群(课题组)?可加我微信hezkz17, 本群提供音频技术答疑服务 1 源码布局 2 源文件与音频文件和生成文件 3 编译方法

数据结构第一课-----------数据结构的介绍

作者前言 &#x1f382; ✨✨✨✨✨✨&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f367;&#x1f382; ​&#x1f382; 作者介绍&#xff1a; &#x1f382;&#x1f382; &#x1f382; &#x1f389;&#x1f389;&#x1f389…

抖音招聘报白怎么处理?

抖音直播招聘报白是通过抖音直播方式展现职位信息&#xff0c;并与求职者进行互动的招聘方式。在抖音平台上&#xff0c;企业或者人力资源公司可以通过直播的形式&#xff0c;将职位以视频直播的方式展现出来。通过抖音直播招聘报白&#xff0c;企业或者人力资源公司可以利用抖…

C#中LINQtoSQL的设置与连接

目录 一、首次安装LinqToSql类 二、非首次安装LinqToSql类 1.接受原有数据库连接 2.建立新的数据库连接 3.建立本地数据库连接 LINQ&#xff08;Language-Integrated Query&#xff0c;语言集成查询&#xff09;是微软公司提供的一项新技术&#xff0c;它能够将查询功能直…

(vue)进入页面自动触发点击事件

(vue)进入页面自动触发点击事件 背景&#xff1a;进入页面后需根据表单默认值查询出数据 效果&#xff1a; 1.alert弹出说明已进入点击事件中 2.成功显示 页面写法 思路&#xff1a;使用 ref 属性将 div 标签绑定到了 Vue 实例中的 clickMe 变量上。在 mounted 钩子函数中&…

IDEA初步入门

1 安装 现在的系统更迭很快&#xff0c;很多软件都只支持win10 和 11了&#xff0c;但我们过时党还在用win7. 所以就必须找到合适的版本。在windows 7 64位系统下&#xff0c;可以使用IDEA 2020.1.4版本。 在Jetbrain官方下&#xff0c;找到历史版本&#xff0c;找到windows版…

基于知识库的chatbot或者FAQ

背景 最近突然想做一个基于自己的知识库&#xff08;knowlegebase&#xff09;的chatbot或者FAQ的项目。未来如果可以在公司用chatgpt或者gpt3.5之后的模型的话&#xff0c;还可以利用gpt强大的语言理解力和搜索出来的用户问题的相关业务文档来回答用户在业务中的问题。 Chat…

react-markdown支持83版本的Chrome,解决Object.hasOwn is not a function问题

旧版浏览器支持 react-markdown用了一个ES2022的api&#xff0c;Object.hasOwn测试的时候一切正常&#xff0c;当我切换到生成环境的旧版的83的Chrome之后&#xff0c;发现会报Object.hasOwn is not a function这个错误。 https://github.com/remarkjs/react-markdown/issues/…

智能运维第一步:HDD磁盘故障预测

当今数字化时代&#xff0c;信息技术扮演着企业和组织运营的关键角色。然而&#xff0c;随着IT环境不断复杂化和数据量激增&#xff0c;传统的运维管理方法已经无法满足日益增长的需求。为应对这一挑战&#xff0c;智能运维&#xff08;Artificial intelligence for IT operati…

在Jetpack Compose中使用Paging 3实现无限滚动

在Jetpack Compose中使用Paging 3实现无限滚动 本文将介绍在Jetpack Compose中进行分页加载。分页加载意味着一次只加载应用程序中的小数据块。 假设您在服务器上有大量数据&#xff0c;并且您希望在UI上显示这些数据。显然&#xff0c;您不希望一次性加载所有数据。您希望每次…

Docker(1)——安装Docker以及配置阿里云镜像加速

目录 一、简介 二、安装Docker 1. 访问Docker官网 2. 卸载旧版本Dokcer 3. 下载yum-utils&#xff08;yum工具包集合&#xff09; 4. 设置国内镜像仓库 5. 更新yum软件包索引 6. 安装Docker 7. 启动Docker 8. 卸载Docker 三、阿里云镜像加速 1. 访问阿里云官网 2. …

C++——类和对象之拷贝构造

拷贝构造 本章思维导图&#xff1a; 注&#xff1a;本章思维导图对应的xmind文件和.png文件都已同步上传到”资源“ 如果我们想要用一个已经存在的对象实例化一个与之完全相同的对象&#xff0c;怎么做呢&#xff1f; C提供了一个简单的方法——拷贝构造 拷贝构造是C类里面默…

如何利用python连接讯飞的星火大语言模型

星火大模型是科大讯飞推出的一款人工智能语言模型&#xff0c;它采用了华为的昇腾910 AI处理器。这款处理器是一款人工智能处理器&#xff0c;具有强大的计算能力和高效的能耗控制能力。 华为昇腾910 AI处理器采用了创新的Da Vinci架构&#xff0c;这种架构在设计上充分考虑了…

均值、方差、标准差

1 中间值和均值 表现&#xff02;中间值&#xff02;的统计名词&#xff1a; a.均值:   mean&#xff0c;数列的算术平均值&#xff0c;反应了数列的集中趋势,等于有效数值的合除以有效数值的个数&#xff0e;b.中位值:  median&#xff0c;等于排序后中间位置的值&#x…

工会排队营销玩法,让消费者乐于参与其中

小编介绍&#xff1a;10年专注商业模式设计及软件开发&#xff0c;擅长企业生态商业模式&#xff0c;商业零售会员增长裂变模式策划、商业闭环模式设计及方案落地&#xff1b;扶持10余个电商平台做到营收过千万&#xff0c;数百个平台达到百万会员&#xff0c;欢迎咨询。 工会…

DC/DC 隔离模块MGS102405、MGS102412、MGS60505、MGS62405、MGS62415直流转换器 Module

概述 MG DC-DC转换器采用行业标准尺寸&#xff0c;包括SIP6、SIP8、1 “ X 1 ”和1 “ X 2 ”。这些模块具有DC4.5至13V/DC9至36V/DC18至76V的宽输入范围和DC1500V&#xff08;1分钟&#xff09;的隔离电压。其他功能包括内置过流保护电路&#xff08;自动恢复&#xff09;、内…

PO- Target XSD requires a value错误处理

问题描述&#xff1a; . Values missing in queue context. Target XSD requires a value forhis element. but the taroet-field mappina does not create one. 原因分析&#xff1a; Xsd即DT、MT对应的字段&#xff0c;上面没有具体写那个字段&#xff0c;但可以判断是消息…

对象存储那点事

在很长的一段时间里&#xff0c;DAS、SAN 和 NAS 这三种架构几乎统治了数据存储市场。所有行业用户的数据存储需求&#xff0c;都是在这三者中进行选择。 然而&#xff0c;随着时代的发展&#xff0c;一种新的数据存储形态诞生&#xff0c;开始挑战前面三者的垄断地位。没错&am…

0基础学习PyFlink——时间滚动窗口(Tumbling Time Windows)

大纲 mapreduce完整代码参考资料 在《0基础学习PyFlink——个数滚动窗口(Tumbling Count Windows)》一文中&#xff0c;我们发现如果窗口内元素个数没有达到窗口大小时&#xff0c;计算个数的函数是不会被调用的。如下图中红色部分 那么有没有办法让上图中&#xff08;B,2&…