From 288d78f66ecd1b628e8d1df7a3da99fc5e6880ec Mon Sep 17 00:00:00 2001 From: zhangqian <zhangqian@123.com> Date: 星期五, 08 十二月 2023 14:13:37 +0800 Subject: [PATCH] debug --- pkg/snowflake/snowflake.go | 102 ++++++++++++++++++++++++++++++++++++-------------- 1 files changed, 73 insertions(+), 29 deletions(-) diff --git a/pkg/snowflake/snowflake.go b/pkg/snowflake/snowflake.go index cf134be..049b307 100644 --- a/pkg/snowflake/snowflake.go +++ b/pkg/snowflake/snowflake.go @@ -10,20 +10,70 @@ var Node *snowflake.Node -func Init(nodeId string) error { - // Create a new Node with a Node number of 1 +func Init(nodeId int64) error { + // Create a new Node with a Node number of 0~1023 var err error - nodeIdInt, err := StringToNumber(nodeId) - if err != nil { - logx.Errorf("snowflake Init error:%v", err) - return err - } - Node, err = snowflake.NewNode(nodeIdInt) + 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) { @@ -32,31 +82,25 @@ if err != nil { return 0, err } - hashValue := int64(hash.Sum32()) - return hashValue, nil + 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 鏁e垪绠楁硶璁$畻鍝堝笇鍊� + hash := fnv.New32a() + hash.Write(parsedIP) + return int64(hash.Sum32() % 1024), nil // 鍙栦綑鏁扮‘淇濈粨鏋滃湪 1 鍒� 1023 涔嬮棿 } 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)) - } + InitWithIP() } return int64(Node.Generate()) } -- Gitblit v1.8.0