MCPcopy Create free account
hub / github.com/Super-long/ChubbyGo / GetMachineIdentification

Function GetMachineIdentification

Flake/flake.go:53–84  ·  view source on GitHub ↗

* * @brief: 根据本机网卡MAC地址和随机数拼出一个16位的机器标识 * @notes: sony的雪花算法库默认的生成机器标示函数是使用内网IP算的,因为客户端在调用这个函数,现在基本都使用NET技术,很可能出现重复,所以需要修改生成机器标识函数. * 目前打算前6位为分别为mac地址六项的第一个数的最后一位之间互相异或,后十位为随机值,因为还有时间戳位,这样可以最大化保证全局不会出现唯一ID,但是其实还是有可能. * 且因为同一个主机生成的机器标示肯定还是一样的,所以测试代码还是只能手动改UUID. */

()

Source from the content-addressed store, hash-verified

51 * 且因为同一个主机生成的机器标示肯定还是一样的,所以测试代码还是只能手动改UUID.
52 */
53func GetMachineIdentification() (uint16, error) {
54 interfaces, err := net.Interfaces()
55 if err != nil {
56 log.Println("ERROR : Error reading network interface. " + err.Error())
57 // 需要先检查Error
58 return 0, nil
59 }
60 var res uint16 = 0
61 // 8c:16:45:36:2 e:c 4
62 // 1 3 6 9 12 15
63 var indexs = [6]uint32{0, 3, 6, 9, 12, 15}
64
65 for _, inter := range interfaces {
66 mac := inter.HardwareAddr.String() //获取本机MAC地址 17位字符串
67 //fmt.Println("DEBUG : MAC = ", mac)
68 if len(mac) == 17 { // 8c:16:45:36:2e:c4
69 for i := 0; i < 6; i++ {
70 var temp uint8 = 0
71 temp = mac[indexs[i]] & 1 // 取最后一位
72 res ^= uint16(temp << i)
73 }
74 }
75 }
76
77 // 生成0到1023的随机数
78 rand.Seed(time.Now().Unix()) // 用时间作为随机数种子
79 high := rand.Intn(1023) // 伪随机数
80
81 res |= uint16(high<<6)
82 //log.Printf("DEBUG : machine identification(%b)\n", res)
83 return res, nil
84}

Callers

nothing calls this directly

Calls 1

ErrorMethod · 0.45

Tested by

no test coverage detected