zhangqian
2023-12-08 115aeb4d9f9b2399c186f55f13afc2c63c50ce3b
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
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 地址列表
    addrs, err := net.LookupIP("localhost")
    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())
        }
    }
 
    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())
}