e6956aa001
- React frontend with route-level code splitting - Backend rebranded from Baihu to TaskPool - DB brand migration script and local compatibility
52 lines
1.3 KiB
Go
52 lines
1.3 KiB
Go
package utils
|
|
|
|
import (
|
|
"crypto/sha256"
|
|
"encoding/hex"
|
|
"net"
|
|
"os"
|
|
"runtime"
|
|
"sort"
|
|
"strings"
|
|
)
|
|
|
|
// GenerateMachineID 生成机器识别码
|
|
func GenerateMachineID() string {
|
|
var parts []string
|
|
|
|
// 主机名
|
|
if hostname, err := os.Hostname(); err == nil {
|
|
parts = append(parts, hostname)
|
|
}
|
|
|
|
// 获取所有非回环网卡的 MAC 地址,排序后取第一个(最稳定)
|
|
if interfaces, err := net.Interfaces(); err == nil {
|
|
var macs []string
|
|
for _, iface := range interfaces {
|
|
// 跳过回环接口、没有 MAC 地址的接口、虚拟接口
|
|
if iface.Flags&net.FlagLoopback != 0 || len(iface.HardwareAddr) == 0 {
|
|
continue
|
|
}
|
|
// 跳过 docker/veth 等虚拟网卡
|
|
name := strings.ToLower(iface.Name)
|
|
if strings.HasPrefix(name, "docker") || strings.HasPrefix(name, "veth") ||
|
|
strings.HasPrefix(name, "br-") || strings.HasPrefix(name, "virbr") {
|
|
continue
|
|
}
|
|
macs = append(macs, iface.HardwareAddr.String())
|
|
}
|
|
sort.Strings(macs)
|
|
// 只使用第一个 MAC 地址(最稳定)
|
|
if len(macs) > 0 {
|
|
parts = append(parts, macs[0])
|
|
}
|
|
}
|
|
|
|
// 操作系统和架构
|
|
parts = append(parts, runtime.GOOS, runtime.GOARCH)
|
|
|
|
data := strings.Join(parts, "|")
|
|
hash := sha256.Sum256([]byte(data))
|
|
return hex.EncodeToString(hash[:])
|
|
}
|