封装,k8s使用namespace作为雪花id的node节点
package snowflake
import (
"crypto/sha256"
"encoding/binary"
"github.com/bwmarrin/snowflake"
)
type Snowflake struct {
nodeStr string
node *snowflake.Node
}
func NewSnowflake(nodeStr string) *Snowflake {
nodeID := generateNodeID(nodeStr) % 1024
node, err := snowflake.NewNode(nodeID)
if err != nil {
panic(err)
}
return &Snowflake{
nodeStr: nodeStr,
node: node,
}
}
func (s *Snowflake) NextId() int64 {
return s.node.Generate().Int64()
}
func generateNodeID(nodeStr string) int64 {
h := sha256.New()
h.Write([]byte(nodeStr))
hashBytes := h.Sum(nil)
first8 := binary.BigEndian.Uint64(hashBytes[:8])
last8 := binary.BigEndian.Uint64(hashBytes[24:32])
return int64(first8^last8) & 0x7FFFFFFFFFFFFFFF
}