【问题标题】:How Can I make millisecond Unique?我怎样才能使毫秒唯一?
【发布时间】:2026-01-27 13:40:01
【问题描述】:

我正在使用 NodeJs。

我不断收到来自服务器的请求。 我添加了一些变量,如 createdTime 并保存到数据库中。 当我在某些情况下按 createdTime 排序数据时它不可靠,它是重复的

如何区分它们?

  • 我不想计算请求。
  • 我不喜欢更改时间戳的格式。

var createdTime = new Date().getTime();

【问题讨论】:

  • 为什么不在sql查询中保存为NOW()而不是作为参数传递。
  • @BasvanStein 浏览器客户端的时间,是本地时间。他可能想节省时间。 (虽然我认为应该保存UTC)但他可能想使用那个特定时间。
  • 如果不将类型更改为字符串或其他格式,您将无法做到这一点。看起来像这里的设计流程。
  • 真的,一个简单的服务器端全局计数器在这里是一个非常简单的解决方案。您可以单独使用计数器,也可以将其与时间结合使用。
  • 我没有使用类似 .我正在使用 ElasticSearch :)

标签: javascript node.js


【解决方案1】:

这是一种将计数器与当前时间相结合的方法,允许您在同一毫秒内拥有多达 1000 个单独的事务,这些事务都是唯一编号的,但仍然是基于时间的值。

还有,这里有一个工作的 sn-p 来说明:

// this guarantees a unique time-based id
// as long as you don't have more than 1000
// requests in the same ms
var getTransactionID = (function() {
  var lastTime, counter = 0;
  return function() {
    var now = Date.now();
    if (now !== lastTime) {
      lastTime = now;
      counter = 0;
    } else {
      ++counter;
    }
    return (now * 1000) + counter;
  }
})();

for (var i = 0; i < 100; i++) {
    document.write(getTransactionID() + "<br>");
}

如果您想要一些可能跨集群工作的东西,您可以使用process.hrtime() 来使用高分辨率计时器而不是计数器,然后将 id 设置为可以在需要时解析为相对时间的字符串。由于这需要 node.js,所以我无法在浏览器中创建一个有效的 sn-p,但这里的想法是:

// this makes a unique time-based id
function getTransactionID () {
    var now = Date.now();
    var hrtime = process.hrtime();
    return now + "." + ((hrtime[0] * 1e9) + hrtime[1]);
}

【讨论】:

  • 重复@jfriend00
  • 在保持毫秒精度时要考虑的一件事是,集群很容易在毫秒内被命中两次,从而导致重复,而在中等工作负载下添加 hrtime 使得重复的可能性大大降低。
  • @Alyreza - 告诉我它怎么可能重复?你真的每毫秒收到超过 1000 个请求吗?向我展示一个实际上可以做到这一点的服务器。如果您想要一个大于 1000 的数字,则增加代码中的倍数 - 就这么简单,但我怀疑这是现实世界的问题。
  • @Alyreza - 您必须在 img 中显示生成该日志的实际代码。你在那个 img 中的格式不是我的任何一个代码 sn-ps 产生的,所以我不知道你从哪里得到它。我的答案中的第二种形式如果不先解析就不能直接排序,但是如果你解析它(在小数点前后分开),那么它是可排序的或可比较的。问题是纯数字的范围太大,所以你必须在一个字符串中使用多个数字,这只需要更多的代码来比较或排序,但这是可行的。
  • @Alyreza - 仅供参考,我的答案中的第一个代码 sn-p 是一个数字,可以直接比较或排序。
【解决方案2】:

由于我的代表率低,我无法添加评论,但看起来你需要超过毫秒。也许这个 * 问题可以帮助你

How to get a microtime in Node.js?

【讨论】: