package snowflake import ( "apsClient/pkg/logx" "fmt" "github.com/bwmarrin/snowflake" "hash/fnv" "net" ) var Node *snowflake.Node func Init(nodeId int64) error { // Create a new Node with a Node number of 0~1023 var err error Node, err = snowflake.NewNode(nodeId) if err != nil { logx.Errorf("snowflake NewNode error:%v", err) return err } return nil } func InitWithIP() { // 使用 LookupIP 获取主机的 IP 地址列表 addrs, err := net.LookupIP("localhost") if err != nil { logx.Errorf("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() logx.Errorf("IPv4 Address: %s\n", ipNet.String()) } } ipNumber, err := ipToNumber(ip) if err != nil { logx.Errorf("snowflake can not generate, init error, ip to number error :%v", err) panic(fmt.Sprintf("snowflake can not generate, init error, ip to number error :%v", err)) } err = Init(ipNumber) if err != nil { logx.Errorf("snowflake can not generate, init error :%v", err) panic(fmt.Sprintf("snowflake can not generate, init error :%v", err)) } } func StringToNumber(input string) (int64, error) { hash := fnv.New32a() _, err := hash.Write([]byte(input)) if err != nil { return 0, err } return int64(hash.Sum32() % 1024), nil // 取余数确保结果在 1 到 1023 之间 } func ipToNumber(ip string) (int64, error) { // 将 IP 地址字符串解析为 net.IP 类型 parsedIP := net.ParseIP(ip) if parsedIP == nil { return 0, fmt.Errorf("invalid IP address:%v", ip) } // 使用 FNV-1a 散列算法计算哈希值 hash := fnv.New32a() hash.Write(parsedIP) return int64(hash.Sum32() % 1024), nil // 取余数确保结果在 1 到 1023 之间 } func GenerateID() int64 { if Node == nil { InitWithIP() } return int64(Node.Generate()) }