zhangqian
2023-12-08 e673885c64d5645c2c38e10ddfd922657afdc4cb
使用ip初始化雪花算法
1个文件已修改
50 ■■■■ 已修改文件
pkg/snowflake/snowflake.go 50 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pkg/snowflake/snowflake.go
@@ -23,21 +23,47 @@
func InitWithIP() {
    // 使用 LookupIP 获取主机的 IP 地址列表
    addrs, err := net.LookupIP("localhost")
    // 获取本机所有网络接口
    interfaces, err := net.Interfaces()
    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())
        }
        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)