65 lines
1.0 KiB
Go
65 lines
1.0 KiB
Go
package snowflake
|
|
|
|
import (
|
|
"errors"
|
|
"net"
|
|
|
|
sf "github.com/GUAIK-ORG/go-snowflake/snowflake"
|
|
)
|
|
|
|
var snowflake *sf.Snowflake
|
|
|
|
func init() {
|
|
localIp3, err := GetLocalIp()
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
dataCenterID := int64(localIp3 >> 4)
|
|
workerID := int64(localIp3 & 0xf)
|
|
snowflake, err = sf.NewSnowflake(dataCenterID, workerID)
|
|
if err != nil {
|
|
panic(err)
|
|
}
|
|
}
|
|
|
|
func GetID() int64 {
|
|
return snowflake.NextVal()
|
|
}
|
|
|
|
func GetTimestamp(id int64) int64 {
|
|
return sf.GetTimestamp(id)
|
|
}
|
|
|
|
func GetGenTimestamp(id int64) int64 {
|
|
return sf.GetGenTimestamp(id)
|
|
}
|
|
|
|
func GetLocalIp() (byte, error) {
|
|
ifaces, err := net.Interfaces()
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
|
|
for _, i := range ifaces {
|
|
addrs, errRet := i.Addrs()
|
|
if errRet != nil {
|
|
continue
|
|
}
|
|
|
|
for _, addr := range addrs {
|
|
var ip net.IP
|
|
switch v := addr.(type) {
|
|
case *net.IPNet:
|
|
if v.IP.IsGlobalUnicast() {
|
|
ip = v.IP.To4()
|
|
if ip != nil {
|
|
return ip[3], nil
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return 0, errors.New("no validate ifaces to IPV4")
|
|
}
|