以下是使用 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内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论