该算法实现一个简单的有序数字ID生成器,主要依赖节点ID和时间戳。每个ID生成节点被分配一个节点ID(nodeid),节点ID范围在1-1023之间。每个ID在生成时会记录一个时间戳(timestamp)。算法通过节点ID和时间戳算出一个序号(sequence),并与节点ID拼接生成最终ID。 该算法可以保证:
- ID全局唯一:依赖节点ID和时间戳唯一性
- ID有序:后生成的ID序号必定大于先生成的ID
- 高性能:没有依赖数据库等外部资源,纯内存计算
- 设置节点ID(nodeid),范围1-1023
- 获取当前时间戳(timestamp)
- 计算序号(sequence):
- sequence = (timestamp - 节点启动时间戳) / 时间戳步长
- 时间戳步长建议设置为1ms
- 生成ID:ID = 节点ID * 1024 + sequence
package main
import (
"log"
"github.com/474420502/orderedid"
)
func main() {
var id orderedid.OrderedID
creator := orderedid.New() // orderedid.NewWith(1)
id = creator.Create()
log.Println(id.Uint64(), id.Base58(), id.Timestamp(), id.NodeID()) // 142125288653825 27noD5f5R 1646623082475 0
}
func BenchmarkCase(b *testing.B) {
var id OrderedID
creator := New()
for i := 0; i < b.N; i++ {
id = creator.Create()
}
b.Log(id)
}
goos: linux
goarch: amd64
pkg: github.com/474420502/orderedid
cpu: AMD Ryzen 7 5700G with Radeon Graphics
BenchmarkCaseMID-16 24551696 42.77 ns/op 0 B/op 0 allocs/op