feat(serial):完成冰雹ID生成算法功能支持。
This commit is contained in:
		
							
								
								
									
										7
									
								
								serial_code/hail/errors.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								serial_code/hail/errors.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
			
		||||
package hail
 | 
			
		||||
 | 
			
		||||
type HailAlgorithmNotInitializedError struct{}
 | 
			
		||||
 | 
			
		||||
func (e *HailAlgorithmNotInitializedError) Error() string {
 | 
			
		||||
	return "冰雹ID生成算法尚未初始化"
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										73
									
								
								serial_code/hail/hail.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										73
									
								
								serial_code/hail/hail.go
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,73 @@
 | 
			
		||||
// 提供基于雪花ID生成算法改进的短日期短主机板冰雹ID生成算法
 | 
			
		||||
package hail
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"sync"
 | 
			
		||||
	"time"
 | 
			
		||||
 | 
			
		||||
	"archgrid.xyz/ag/toolsbox/types"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// 用于记录当前冰雹ID组成内容的数据结构
 | 
			
		||||
type _HailAlgorithm struct {
 | 
			
		||||
	hostSerial    int64
 | 
			
		||||
	lastTimestamp int64
 | 
			
		||||
	lastSequence  int64
 | 
			
		||||
	lock          sync.Mutex
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
var hailAlgorithmInstance *_HailAlgorithm
 | 
			
		||||
 | 
			
		||||
// 获取当前已经完成初始化的冰雹ID生成算法实例,如果尚未完成初始化则会返回未初始化的错误。
 | 
			
		||||
func Get() (*_HailAlgorithm, error) {
 | 
			
		||||
	if hailAlgorithmInstance == nil {
 | 
			
		||||
		return nil, &HailAlgorithmNotInitializedError{}
 | 
			
		||||
	}
 | 
			
		||||
	return hailAlgorithmInstance, nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 指定一个主机编号,并完成冰雹ID生成算法的初始化。
 | 
			
		||||
func Initialize(hostSerial int64) {
 | 
			
		||||
	hailAlgorithmInstance = &_HailAlgorithm{
 | 
			
		||||
		hostSerial:    hostSerial,
 | 
			
		||||
		lastTimestamp: types.Timestamp(),
 | 
			
		||||
		lastSequence:  0,
 | 
			
		||||
		lock:          sync.Mutex{},
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 返回一个可用的时间戳,如果主机发生了时间回拨,那么将等待一秒钟。
 | 
			
		||||
func (h *_HailAlgorithm) timestamp() int64 {
 | 
			
		||||
	for {
 | 
			
		||||
		timestamp := types.Timestamp()
 | 
			
		||||
		if timestamp == h.lastTimestamp {
 | 
			
		||||
			h.lastTimestamp = timestamp
 | 
			
		||||
			return timestamp
 | 
			
		||||
		} else if timestamp > h.lastTimestamp {
 | 
			
		||||
			h.lastTimestamp = timestamp
 | 
			
		||||
			h.lastSequence = 0
 | 
			
		||||
			return timestamp
 | 
			
		||||
		}
 | 
			
		||||
		time.Sleep(1 * time.Second)
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 生成一个冰雹ID。
 | 
			
		||||
func (h *_HailAlgorithm) Generate() int64 {
 | 
			
		||||
	h.lock.Lock()
 | 
			
		||||
	defer h.lock.Unlock()
 | 
			
		||||
	timestamp := h.timestamp()
 | 
			
		||||
	h.lastSequence++
 | 
			
		||||
	return (timestamp << 20) | ((h.hostSerial & 0xffff) << 16) | (h.lastSequence & 0xffff_ffff)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 生成一个冰雹ID,并将其转换为字符串。
 | 
			
		||||
func (h *_HailAlgorithm) GenerateString() string {
 | 
			
		||||
	return fmt.Sprintf("%017d", h.Generate())
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 生成一个冰雹ID,将其转换为字符串并附加指定的前缀
 | 
			
		||||
func (h *_HailAlgorithm) GeneratePrefixedString(prefix string) string {
 | 
			
		||||
	return fmt.Sprintf("%s%s", prefix, h.GenerateString())
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user