【问题标题】:Code generating negative numbers while trying to generate unique int64尝试生成唯一 int64 时生成负数的代码
【发布时间】: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


【解决方案1】:

检查是否为负,使其为正:

unixtimestamp := time.Now().UnixNano()
node := AppConfig.NodeID << 44
timestamp := unixtimestamp << 12
var sequenceID int64
for sequenceID = 1; sequenceID <= count; sequenceID++ {
    id := node | timestamp | sequenceID
    if id < 0 {
        id = id *  -1
    }
    idList = append(idList, id)
}

【讨论】:

    猜你喜欢
    • 2011-08-19
    • 1970-01-01
    • 2013-05-04
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    相关资源
    最近更新 更多