go 生成雪花id

package lib

import (
    "sync"
    "time"
)

type AlgorithmSnowFlake struct {
    sync.Mutex
    machineId     int64
    dataCenterId  int64
    lastTimeStamp int64
    sn            int64
}

var algorithmSnowFlake *AlgorithmSnowFlake = nil

func GetAlgorithmSnowFlake() *AlgorithmSnowFlake {
    return algorithmSnowFlake
}

func (sf *AlgorithmSnowFlake) GetID() uint64 {
    sf.Lock()
    defer sf.Unlock()

    curTimeStamp := time.Now().UnixNano() / 1000000   // 13位

    if curTimeStamp == sf.lastTimeStamp {
        if sf.sn > 4095 {
            time.Sleep(time.Millisecond)
            curTimeStamp = time.Now().UnixNano() / 1000000
            sf.sn = 0
        }
    } else {
        sf.sn = 0
    }
    sf.sn++
    sf.lastTimeStamp = curTimeStamp

    // 时间戳向左移动22位
    curTimeStamp = curTimeStamp << 22   // 35

    // 合并机器id
    machineId := sf.machineId << 17     // 18

    // 合并数据中心id
    dataCenterId := sf.dataCenterId << 12   // 13

    // 通过与运算把各个部位连接在一起
    id := curTimeStamp | machineId | dataCenterId | sf.sn
    //return id
    return uint64(id)
}

func NewAlgorithmSnowFlake(machineId int64, dataCenterId int64) {
    algorithmSnowFlake = &AlgorithmSnowFlake{
        machineId:    machineId,
        dataCenterId: dataCenterId,
    }
}

生成10个雪花id

package main

import (
    "test/lib"
    "fmt"
)

func main() {
    lib.NewAlgorithmSnowFlake(1, 1)
    m := map[uint64]int{}
    l := []uint64{}
    for i:=0;i<10;i++{
        newID := lib.GetAlgorithmSnowFlake().GetID()
        m[newID] = i
        l = append(l, newID)
    }

    for k, v := range m{
        fmt.Println(k,v)
    }
}

原文地址:https://www.cnblogs.com/zhangjian0092/p/12559280.html

时间: 2024-10-24 05:10:09

go 生成雪花id的相关文章

Mybatis框架(9)---Mybatis自定义插件生成雪花ID做为表主键项目

Mybatis自定义插件生成雪花ID做为主键项目 先附上项目项目GitHub地址 spring-boot-mybatis-interceptor 有关Mybatis雪花ID主键插件前面写了两篇博客作为该项目落地的铺垫. 1.Mybatis框架---Mybatis插件原理 2.java算法---静态内部类实现雪花算法 该插件项目可以直接运用于实际开发中,作为分布式数据库表主键ID使用. 一.项目概述 1.项目背景 在生成表主键ID时,我们可以考虑主键自增 或者 UUID,但它们都有很明显的缺点 主

php 生成唯一id的几种解决方法

网上查了下,有很多的方法 1.md5(time() . mt_rand(1,1000000)); 这种方法有一定的概率会出现重复 2.php内置函数uniqid() uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID. w3school参考手册有一句话:"由于基于系统时间,通过该函数生成的 ID 不是最佳的.如需生成绝对唯一的 ID,请使用 md5() 函数". 下面方法返回结果类似:5DDB650F-4389-F4A9-A100-501EF1348872 functi

Insert后返回自动插入的生成的ID:select @@identity

当运行完插入语句后,执行select @@identity就可得到自动生成的id 如果是sql server 最好用:select SCOPE_IDENTITY() as id因为@@identity全局的 同类还有IDENT_CURRENT(‘table’) IDENT_CURRENT 返回为任何会话和任何作用域中的特定表最后生成的标识值.IDENT_CURRENT 不受作用域和会话的限制,而受限于指定的表.@@IDENTITY 返回为当前会话的所有作用域中的任何表最后生成的标识值.SCOPE

PHP生成唯一ID的三种方法

1.md5(time() . mt_rand(1,1000000)); 这种方法有一定的概率会出现重复 2.php内置函数uniqid() uniqid() 函数基于以微秒计的当前时间,生成一个唯一的 ID. w3school参考手册有一句话:"由于基于系统时间,通过该函数生成的 ID 不是最佳的.如需生成绝对唯一的 ID,请使用 md5() 函数". 下面方法返回结果类似:5DDB650F-4389-F4A9-A100-501EF1348872 com_create_guid()是p

生成随机id对比

生成随机id 最近公司的项目游戏生成的随机不重复id,重复概率有点大, 代码如下: 1 private static int id = 0; 2 public static int serverID = 0; 3 private static final Object obj = new Object(); 4 5 public static long getId1() { 6 synchronized (obj) { 7 id += 1; 8 return (serverID & 0xFFFF

生成自定义ID

#region 自动生成ID        /// <summary>        /// 自动生成ID        /// </summary>        /// <param name="Table_Name">表名</param>        /// <param name="Pk_Name">关键字</param>        /// <param name="

封装各种生成唯一性ID算法的工具类

/** * Copyright (c) 2005-2012 springside.org.cn * * Licensed under the Apache License, Version 2.0 (the "License"); */ package com.minxinloan.common.utils; import java.security.SecureRandom; import java.util.UUID; /** * 封装各种生成唯一性ID算法的工具类. * @aut

mysql联查时为空补全和jdbc获取最后插入生成的id

如何在mysql里实现 oracle里的两表联查    cat.id=dog.id(+)这种 为空补全的方法left  或者right    outer  join想在哪个表补全 就放在 left或者 right in查询 可以用left semi join 来代替(注意join表不能在select字段中出现) jdbc获取最后插入生成的id       ps = conn.prepareStatement("insert into test(name) value(?)",State

java生成自定义的表ID

需生成如下ID: 56d7ade1-87d1-4f54-8dc8-13611c8c2545 27181ad4-4214-4e12-af3a-911a0103a12f 24cafdfb-eac3-4567-80c0-70d21d096b19 c92046a0-3d94-4d72-ba8f-cdac30ed69e8 1e607dde-eef6-49ac-a3b1-16ba1475d293 在java里可以这样使用: UUID uuid = UUID.randomUUID(); System.out.