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 地址列表 // 获取本机所有网络接口 interfaces, err := net.Interfaces() if err != nil { logx.Errorf("snowflake InitWithIP error:%v", err) return } var ip string // 遍历所有网络接口 for _, iface := range interfaces { // 排除一些特殊的接口,例如 loopback 接口 if iface.Flags&net.FlagUp != 0 && iface.Flags&net.FlagLoopback == 0 { // 获取接口的所有地址 addrs, err := iface.Addrs() if err != nil { logx.Errorf("snowflake InitWithIP error:%v", err) continue } // 遍历接口的所有地址 for _, addr := range addrs { // 检查地址类型是否是 IP 地址 if ipNet, ok := addr.(*net.IPNet); ok && !ipNet.IP.IsLoopback() { // 判断 IP 地址的版本是 IPv4 还是 IPv6 if ipNet.IP.To4() != nil { fmt.Printf("IPv4 Address: %s\n", ipNet.IP.String()) if ipNet.IP.String() != "127.0.0.1" { ip = ipNet.IP.String() goto getIpOK } } else { fmt.Printf("IPv6 Address: %s\n", ipNet.IP.String()) } } } } } getIpOK: if ip == "" { logx.Errorf("snowflake InitWithIP can not find Ip") return } 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()) }