package snowflake import ( "apsClient/pkg/logx" "fmt" "github.com/bwmarrin/snowflake" "hash/fnv" "net" ) var Node *snowflake.Node func Init(nodeId string) error { // Create a new Node with a Node number of 1 var err error nodeIdInt, err := StringToNumber(nodeId) if err != nil { logx.Errorf("snowflake Init error:%v", err) return err } Node, err = snowflake.NewNode(nodeIdInt) if err != nil { logx.Errorf("snowflake NewNode error:%v", err) return err } return nil } func StringToNumber(input string) (int64, error) { hash := fnv.New32a() _, err := hash.Write([]byte(input)) if err != nil { return 0, err } hashValue := int64(hash.Sum32()) return hashValue, nil } func GenerateID() int64 { if Node == nil { // 使用 LookupIP 获取主机的 IP 地址列表 addrs, err := net.LookupIP("localhost") if err != nil { logx.Infof("snowflake can not generate, init error, get ip error:%v", err) panic(fmt.Sprintf("snowflake can not generate, init error, get ip error:%v", err)) } var ip string // 遍历 IP 地址列表 for _, addr := range addrs { // 判断 IP 地址的版本是 IPv4 还是 IPv6 if ipNet := addr.To4(); ipNet != nil { ip = ipNet.String() fmt.Printf("IPv4 Address: %s\n", ipNet.String()) } } err = Init(ip) if err != nil { panic(fmt.Sprintf("snowflake can not generate, init error,:%v", err)) } } return int64(Node.Generate()) }