orderedid

package module
v0.3.1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jun 21, 2023 License: MIT Imports: 7 Imported by: 0

README

简单的序列id只用nodeid区分的唯一id, 有序并基于数据戳

算法原理

该算法实现一个简单的有序数字ID生成器,主要依赖节点ID和时间戳。每个ID生成节点被分配一个节点ID(nodeid),节点ID范围在1-1023之间。每个ID在生成时会记录一个时间戳(timestamp)。算法通过节点ID和时间戳算出一个序号(sequence),并与节点ID拼接生成最终ID。 该算法可以保证:

  1. ID全局唯一:依赖节点ID和时间戳唯一性
  2. ID有序:后生成的ID序号必定大于先生成的ID
  3. 高性能:没有依赖数据库等外部资源,纯内存计算

实现步骤

  1. 设置节点ID(nodeid),范围1-1023
  2. 获取当前时间戳(timestamp)
  3. 计算序号(sequence):
    • sequence = (timestamp - 节点启动时间戳) / 时间戳步长
    • 时间戳步长建议设置为1ms
  4. 生成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

Documentation

Index

Constants

This section is empty.

Variables

View Source
var ErrInvalidBase32 = errors.New("invalid base32")

ErrInvalidBase32 is returned by ParseBase32 when given an invalid []byte

View Source
var ErrInvalidBase58 = errors.New("invalid base58")

ErrInvalidBase58 is returned by ParseBase58 when given an invalid []byte

View Source
var ErrInvalidBase64 = errors.New("invalid base64")

ErrInvalidBase64 is returned by ParseBase64 when given an invalid []byte

Functions

This section is empty.

Types

type OrderedID

type OrderedID uint64

OrderedID 有序的id

func ParseBase32

func ParseBase32(b32 string) (OrderedID, error)

ParseBase32 parses a base32 []byte into a OrderedID

func ParseBase58

func ParseBase58(b58 string) (OrderedID, error)

ParseBase58 parses a base58 []byte into a OrderedID

func ParseBase64 added in v0.3.0

func ParseBase64(b64 string) (OrderedID, error)

ParseBase64 parses a base64 []byte into a OrderedID

func ParseString

func ParseString(ordid string) (OrderedID, error)

ParseString converts a string into a OrderedID

func ParseUint64

func ParseUint64(ordid uint64) OrderedID

ParseUint64 converts an uint64 into a OrderedID

func (OrderedID) Base32

func (orderedid OrderedID) Base32() string

Base32 return a base32 string

func (OrderedID) Base58

func (orderedid OrderedID) Base58() string

Base58 return a base58 string

func (OrderedID) Base64 added in v0.3.0

func (orderedid OrderedID) Base64() string

Base58 return a base64 string

func (OrderedID) Bytes

func (orderedid OrderedID) Bytes() []byte

Bytes return return the bytes(the 8 byte of int64) of ordererid

func (OrderedID) Count added in v0.3.0

func (orderedid OrderedID) Count() uint64

NodeID return the NodeID

func (OrderedID) NodeID

func (orderedid OrderedID) NodeID() uint64

NodeID return the NodeID

func (OrderedID) String

func (orderedid OrderedID) String() string

String return the number string

func (OrderedID) Timestamp

func (orderedid OrderedID) Timestamp() uint64

Timestamp return the timestamp

func (OrderedID) Uint64

func (orderedid OrderedID) Uint64() uint64

Uint64 return the int64 , orderedid

type OrderedIDCreator

type OrderedIDCreator struct {
	// contains filtered or unexported fields
}

func New

func New() *OrderedIDCreator

New nodeid < 64

func NewWith added in v0.3.0

func NewWith(nodeid uint8) *OrderedIDCreator

NewWith nodeid < 64

func (*OrderedIDCreator) Create

func (creator *OrderedIDCreator) Create() OrderedID

Create Create a OrderID

func (*OrderedIDCreator) Destroy added in v0.3.0

func (creator *OrderedIDCreator) Destroy()

Destroy release the used nodeid.

Directories

Path Synopsis

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL