雪花算法

nowflake算法介绍

雪花算法是由64位整数组成的分布式ID,性能高

  1. 第一位 占用1bit,其值始终为0,无实际意义

  2. 时间戳 占用41位,单位为毫米,可以从开始时间一直持续下去,总共可以容纳约69年时间

  3. 工作机器id 占用10位,为项目的工作机器,其中高位5bit是数据中心ID,低位5bit是工作节点ID

  4. 序列号 占用12bit,用来记录同毫秒内产生不同的id号

     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    
    package main
    
    import (
    	"fmt"
    	"time"
    
    	"github.com/bwmarrin/snowflake"
    )
    
    var node *snowflake.Node
    
    // init函数 初始化全局node节点
    // startTime 开始时间    machineID 工作节点
    func Init(startTime string, machineID int64) (err error) {
    	var st time.Time
    	//获取开始时间的时间戳
    	st, err = time.Parse("2006-01-02 15:04:05", startTime)
    	if err != nil {
    		return
    	}
    
    	//初始化开始时间
    	snowflake.Epoch = st.UnixNano() / 1000000
    	//拿到机器id,生成node节点
    	node, err = snowflake.NewNode(machineID)
    	return
    }
    
    // 将节点转化为64位int类型
    func Gen() int64 {
    	return node.Generate().Int64()
    }
    func main() {
    	err := Init("2020-07-01", 1)
    	if err != nil {
    		fmt.Println("init failed, err: %v\n", err)
    	}
    	id := Gen()
    	fmt.Println(id)
    }
    
Licensed under CC BY-NC-SA 4.0
comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计