| | |
| | | |
| | | 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 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 { |
| | | func InitWithIP() { |
| | | // 使用 LookupIP 获取主机的 IP 地址列表 |
| | | addrs, err := net.LookupIP("localhost") |
| | | if err != nil { |
| | | logx.Infof("snowflake can not generate, init error, get ip error:%v", err) |
| | | 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 地址的版本是 IPv4 还是 IPv6 |
| | | if ipNet := addr.To4(); ipNet != nil { |
| | | ip = ipNet.String() |
| | | fmt.Printf("IPv4 Address: %s\n", ipNet.String()) |
| | | logx.Errorf("IPv4 Address: %s\n", ipNet.String()) |
| | | } |
| | | } |
| | | err = Init(ip) |
| | | |
| | | ipNumber, err := ipToNumber(ip) |
| | | if err != nil { |
| | | panic(fmt.Sprintf("snowflake can not generate, init error,:%v", err)) |
| | | 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()) |
| | | } |