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