zhangqian
2023-12-08 5220cfff6d68f24875c5ce832bbe4541b9fe6639
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package snowflake
 
import (
    "apsClient/pkg/logx"
    "fmt"
    "github.com/bwmarrin/snowflake"
    "hash/fnv"
    "net"
)
 
var Node *snowflake.Node
 
func Init(nodeId string) error {
    // Create a new Node with a Node number of 1
    var err error
    nodeIdInt, err := StringToNumber(nodeId)
    if err != nil {
        logx.Errorf("snowflake Init error:%v", err)
        return err
    }
    Node, err = snowflake.NewNode(nodeIdInt)
    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 {
        // 使用 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))
        }
    }
    return int64(Node.Generate())
}