Go基于雪花算法生成随机id

 更新时间:2024年05月12日 15:42:36   作者:paterl  
雪花算法是twitter开源的由64位整数组成的分布式ID,本文主要介绍了Go基于雪花算法生成随机id,具有一定的参考价值,感兴趣的可以了解一下

雪花算法

雪花算法是twitter开源的由64位整数组成的分布式ID,性能高,并且在单机上递增。

在这里插入图片描述

1.第一位占用1bit,其值始终是0,没有实际作用。

2.时间戳占用41bit,单位为毫秒,总共可以容纳约69年的时间。当然,我们的时间毫秒计数不会真的从1970年开始记,那样我们的系统跑到2039/9/7 23:47:35 就不能用了,所以这里的时间戳只是相对于某个时间的增量,比如我们的系统上线是2023-03-17,那么我们完全可以把这个timestamp当作是从2023-03-17 00:00:00. 000的偏移量。

3.工作机器id占用10bit,其中高位5bit是数据中心ID,低位5bit是工作节点ID,最多可以容纳1024个节点。

4.序列号占用12bit,用来记录同毫秒内产生的不同id。每个节点每毫秒0开始不断累加,最多可以累加到4095,同一毫秒-共可以产生4096个ID。SnowFlake算法在同一毫秒内做多可以产生多少全局唯一ID呢?同一毫秒的ID数量 = 1024 X 4096 = 4194304

Go实现代码

1.github.com/bwmarrin/snowflake

package main

import (
	"fmt"
	"github.com/bwmarrin/snowflake"
	"time"
)

var node *snowflake.Node

//初始化一个node
func Init(startTime string, machineID int64) (err error) {
	//自定义开始时间
	var st time.Time
	st, err = time.Parse("2006-01-02", startTime)
	if err != nil {
		return
	}
	snowflake.Epoch = st.UnixNano() / 1000000
	node, err = snowflake.NewNode(machineID)
	return
}
func GenID() int64 {
	return node.Generate().Int64()
}
func main() {
	if err := Init("2023-03-17", 1); err != nil {
		fmt.Printf("init failed, err:%v\n", err)
		return
	}
	id := GenID()
	fmt.Println(id)
}

var (
	sonyFlake     *sonyflake.Sonyflake // 实例
	sonyMachineID uint16
	//机器ID
)

func getMachineID() (uint16, error) { //返回全局定义的机器ID
	return sonyMachineID, nil
}

2.github.com/sony/sonyflake

package main

import (
	"fmt"
	"github.com/sony/sonyflake"
	"time"
)
var (
	sonyFlake     *sonyflake.Sonyflake // 实例
	sonyMachineID uint16
	//机器ID
)

func getMachineID() (uint16, error) { //返回全局定义的机器ID
	return sonyMachineID, nil
}

//需传入当前的机器ID
func Init(machineId uint16) (err error) {
	sonyMachineID = machineId
	t, _ := time.Parse(" 2006-01-02", "2023-03-17") //初始化一个开始的时间
	settings := sonyflake.Settings{
		// 生成全局配置
		StartTime: t,
		MachineID: getMachineID, //指定机器ID
	}
	sonyFlake = sonyflake.NewSonyflake(settings) // 用配置生成sonyflake节点
	return
}

// GetID返回生成的id值
func GetID() (id uint64, err error) { //拿到sonyflake节 点生成id值
	if sonyFlake == nil {
		err = fmt.Errorf("snoy flake not inited")
		return
	}
	id, err = sonyFlake.NextID()
	return
}

到此这篇关于Go基于雪花算法生成随机id的文章就介绍到这了,更多相关Go 生成随机id内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Go语言中函数的参数传递与调用的基本方法

    Go语言中函数的参数传递与调用的基本方法

    这篇文章主要介绍了Go语言中函数的参数传递与调用的基本方法,是golang入门学习中的基础知识,需要的朋友可以参考下
    2015-10-10
  • 浅析如何利用Go的plugin机制实现热更新

    浅析如何利用Go的plugin机制实现热更新

    热更新,或称热重载或动态更新,是一种软件更新技术,允许程序在运行时,不停机更新代码或资源,本文主要来讨论下GO语言是否可以利用plugin机制实现热更新,感兴趣的可以了解下
    2024-04-04
  • go web 预防跨站脚本的实现方式

    go web 预防跨站脚本的实现方式

    这篇文章主要介绍了go web 预防跨站脚本的实现方式,文中给大家介绍XSS最佳的防护应该注意哪些问题,本文通过实例代码讲解的非常详细,需要的朋友可以参考下
    2021-06-06
  • 一文带你学会Go select语句轻松实现高效并发

    一文带你学会Go select语句轻松实现高效并发

    这篇文章主要为大家详细介绍了Golang中select语句的用法,文中的示例代码讲解详细,对我们学习Golang有一定的帮助,需要的可以参考一下
    2023-03-03
  • 浅谈go 协程的使用陷阱

    浅谈go 协程的使用陷阱

    这篇文章主要介绍了浅谈go 协程的使用陷阱,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-12-12
  • 一文教你学会Go中singleflight的使用

    一文教你学会Go中singleflight的使用

    缓存在项目中使用应该是非常频繁的,提到缓存只要了解过 singleflight ,基本都会用于缓存实现的一部分吧,下面就跟随小编一起来学习一下singleflight的使用吧
    2024-02-02
  • Golang实现支持多种类型的set

    Golang实现支持多种类型的set

    在项目开发中,常常会用到set去重,为什么不写一个set呢,而且go现在支持了泛型,所以本文就来用Golang实现一个支持多种类型的set呢
    2023-05-05
  • 手把手带你走进Go语言之语法基础解析

    手把手带你走进Go语言之语法基础解析

    这篇文章主要介绍了手把手带你走进Go语言之语法基础,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • 探索Golang Redis实现发布订阅功能实例

    探索Golang Redis实现发布订阅功能实例

    这篇文章主要介绍了Golang Redis发布订阅功能实例探索,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2024-01-01
  • Go实现分布式系统高可用限流器实战

    Go实现分布式系统高可用限流器实战

    这篇文章主要为大家介绍了Go实现分布式系统高可用限流器实战,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06

最新评论