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())
|
}
|