当前位置: 代码网 > it编程>前端脚本>Golang > golang雪花算法实现64位的ID的示例代码

golang雪花算法实现64位的ID的示例代码

2024年11月03日 Golang 我要评论
以下是使用 go 语言实现雪花算法生成 64 位 id 的示例代码:package mainimport ( "fmt" "sync" "time")const ( // 起始

以下是使用 go 语言实现雪花算法生成 64 位 id 的示例代码:

package main

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

const (
    // 起始时间戳(2020-01-01)
    twepoch        = 1577836800000
    workeridbits   = 5
    datacenteridbits = 5
    sequencebits   = 12

    maxworkerid     = -1 ^ (-1 << workeridbits)
    maxdatacenterid = -1 ^ (-1 << datacenteridbits)
    maxsequence     = -1 ^ (-1 << sequencebits)

    workeridshift      = sequencebits
    datacenteridshift  = sequencebits + workeridbits
    timestampleftshift = sequencebits + workeridbits + datacenteridbits
)

type snowflake struct {
    mu            sync.mutex
    lasttimestamp int64
    workerid      int64
    datacenterid  int64
    sequence      int64
}

func newsnowflake(workerid, datacenterid int64) (*snowflake, error) {
    if workerid < 0 || workerid > maxworkerid {
        return nil, fmt.errorf("worker id must be between 0 and %d", maxworkerid)
    }
    if datacenterid < 0 || datacenterid > maxdatacenterid {
        return nil, fmt.errorf("datacenter id must be between 0 and %d", maxdatacenterid)
    }
    return &snowflake{
        workerid:      workerid,
        datacenterid:  datacenterid,
        lasttimestamp: -1,
        sequence:      0,
    }, nil
}

func (s *snowflake) nextid() int64 {
    s.mu.lock()
    defer s.mu.unlock()

    timestamp := time.now().unixnano() / 1e6
    if timestamp < s.lasttimestamp {
        return 0
    }

    if s.lasttimestamp == timestamp {
        s.sequence = (s.sequence + 1) & maxsequence
        if s.sequence == 0 {
            for timestamp <= s.lasttimestamp {
                timestamp = time.now().unixnano() / 1e6
            }
        }
    } else {
        s.sequence = 0
    }

    s.lasttimestamp = timestamp
    return ((timestamp - twepoch) << timestampleftshift) |
        (s.datacenterid << datacenteridshift) |
        (s.workerid << workeridshift) |
        s.sequence
}

你可以使用以下方式调用:

func main() {
    sf, err := newsnowflake(1, 1)
    if err!= nil {
        panic(err)
    }
    id := sf.nextid()
    fmt.println(id)
}

这个实现创建了一个雪花算法的结构体snowflake,通过互斥锁保证并发安全。它根据当前时间戳、工作节点 id、数据中心 id 和序列号生成唯一的 64 位 id。生成的 id 是一个递增的数字,具有时间顺序性,并且在分布式系统中可以保证唯一性。

到此这篇关于golang雪花算法实现64位的id的示例代码的文章就介绍到这了,更多相关golang 64位的id内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

  • Go语言中hot path的作用

    Go语言中hot path的作用

    在 go 语言以及其他编程语言中,“hot path” 是指在性能敏感的应用程序中频繁执行的代码路径。对于 go 开发工程师来说,理解和... [阅读全文]
  • Go语言中常量的实现

    Go语言中常量的实现

    常量可以理解为是一个存储了不可以改变的值的变量。常量主要用于特殊值的语义化,使这些值在更容易维护的情况下不会被程序所修改。go 语言中声明常量使用的关键字是co... [阅读全文]
  • GO语言打包成.exe程序的方法

    GO语言打包成.exe程序的方法

    go语言的强大之处在于可以轻松将源代码编译为独立的可执行文件。以下是将go程序打包成windows系统下的.exe文件的详细步骤。1. 安装go编译器在进行打包... [阅读全文]
  • go语言中proto文件的使用

    go语言中proto文件的使用

    在 go 语言中,.proto文件是用于定义 protocol buffers 数据结构和服务的文件格式。protocol buffers 是一种语言无关、平台... [阅读全文]
  • 使用Go语言实现简单聊天系统

    使用Go语言实现简单聊天系统

    在互联网时代,聊天系统是常见的应用场景之一。无论是即时通讯、在线客服还是多人游戏中的消息系统,聊天功能的实现都是必不可少的。本文将使用 go 语言,结合 web... [阅读全文]
  • go语言中的数组指针和指针数组的区别小结

    1.介绍大家知道c语言之所以强大,就是因为c语言支持指针,而且权限特别大,c语言可以对计算机中任何内存的指针进行操作,这样自然而然也会带来一些不安全的因素,所以在golang中,「…

    2024年11月03日 前端脚本

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com