【发布时间】:2020-06-21 10:07:12
【问题描述】:
我正在尝试使用以下 Go 代码创建唯一的 int64
unixtimestamp := time.Now().UnixNano()
node := AppConfig.NodeID << 44
timestamp := unixtimestamp << 12
var sequenceID int64
for sequenceID = 1; sequenceID <= count; sequenceID++ {
id := node | timestamp | sequenceID
idList = append(idList, id)
}
上面的代码也在生成负数。我该如何解决?
【问题讨论】:
-
最简单的解决方法是将
int64值转换为uint64。正确的修复?我们需要更多地了解您的算法和其中涉及的价值观。 -
@icza 谢谢,我正在尝试为 db 表唯一的 bigint 列生成唯一的 int64
-
将负数乘以 -1 几乎适用于所有情况。
-
@Volker 是否保证唯一性
-
如果你的负数是唯一的,而不是将它们乘以任何数字!= 0 不会使它们不唯一,尤其是如果乘以 -1 则不会,因为这不会(在几乎所有情况下)溢出。我猜你生成“uniq”数字的方式存在严重缺陷,它们是负数是迄今为止你最小的问题。
标签: go unix-timestamp