Open programmerZhou opened 7 years ago
@programmerZhou 你的意思不取余反而是正确的?
@hy05190134 强转让其溢出即是取模。
return uint32(time.Now().UnixNano()/int64(1000000))
return uint32(time.Now().UnixNano()/int64(1000000) % 0x100000000)
上面这两行等价。
类似的写法还有
// 对一个数除2
a := x / 2
// 也可写成
a = x >> 1
上面的问题主要是MAX_TIMESTAMP定义的不对,应该是0x100000000, 时间戳是环绕的,达到最大值之后,下一个值为0,即0xffffffff的下一个值为0。
注:位运算一般效率更高。
这个需要实测,spec里面写的有些不准确,所以设置了一个最大支持的时间范围。
上面的描述说明了的timestamp是32的无符号整数所表示的毫秒,由于该值最大只能表示不到50天的时间戳,所以需要对时间戳做环绕式处理。
该函数取系统当前时间(毫秒)作为时间戳,然后与 MAX_TIMESTAMP取模,这样也确实实现的环绕处理, 但是我看到MAX_TIMESTAMP的定义如下:
正确的定义该值应该是32位无符号整数的最大值+1, 即0x100000000,defines.go文件对该值的定义的显然不对。
超过32位无符号整数的部分会被自然溢出,我们强制转换得到溢出后剩下的部分,即实现了环绕,也相当于对0x100000000做取模操作。