【问题标题】:Is Date epoch a secure unique identifier?日期时代是安全的唯一标识符吗?
【发布时间】:2015-09-12 13:11:02
【问题描述】:

我正在编写一个 Node API,并获得了一个模型,我必须为其生成一个15 位随机数。这必须是唯一的并且不应该看起来微不足道(我无法获得自动增量)。

我真的不想生成一个数字并针对 Mongo 数据库进行查询以进行存在性检查。我必须以这种方式基于 Promise 生成某种 while 循环。

我想过简单地使用new Date().epoch,但是,这会是独一无二的吗?我能得到一份副本吗?

然后我还想附加类似的东西:

function privateKey (howMany, chars) {
    chars = chars
        || "0123456789";
    var rnd = crypto.randomBytes(howMany)
        , value = new Array(howMany)
        , len = chars.length;

    for (var i = 0; i < howMany; i++) {
        value[i] = chars[rnd[i] % len]
    };

    return parseInt(value.join(''));
}

包括避免重复。我应该如何实现这个?

编辑,这应该是一个数字。

我知道有 uuid 和 Mongo ObjectId,但它们不仅仅是数字。

【问题讨论】:

  • epoch 是自 1970 年 1 月 1 日以来的毫秒数,因此如果您在同一毫秒内调用它两次,您将得到重复。除了那种情况,你不会得到重复。另请参阅 stackoverflow.com/questions/105034/… 以生成 UUID。
  • 为什么不能自增?

标签: javascript node.js mongodb token


【解决方案1】:

为什么不使用ObjectId

根据 MongoDB 文档,ObjectId 是一个 12 字节的 BSON 类型,构造使用:

  • 一个 4 字节的值,表示自 Unix 纪元以来的秒数,
  • 一个 3 字节的机器标识符,
  • 一个 2 字节的进程 ID,以及
  • 一个 3 字节的计数器,从一个随机值开始。

ObjectId 小且生成速度快。 MongoDB 客户端应添加具有唯一 ObjectId 的 _id 字段。但是,如果客户端没有添加 _id 字段,mongod 将添加一个包含 ObjectId 的 _id 字段。

编辑: 您可以使用以下代码将 ObjectId 转换为您选择的多个长度。

var idNum = parseInt(ObjectId.valueOf(), 15);

【讨论】:

  • 通过转换为长度为 n 的数字,ObjectId 格式将如何工作?这不会修剪 _id 导致重复的短长度吗?
  • 而 .valueOf 将 NaN 作为值
【解决方案2】:

使用时间生成唯一 ID不安全。作为。建议你可能会因为同步不好而得到重复。

如果没有数字并不重要,您应该使用基于 RFC4122 的 node-uuid 生成唯一 ID。

【讨论】:

    【解决方案3】:

    我认为这不是一个好主意。原因之一是系统时间偏差。在与某些基准服务器同步时间后,您会得到重复。事实上,这可能每隔几个小时在运行时发生一次。一些服务器有严重的时间漂移​​,它们每隔一段时间就会同步时间。任何时候发生这种情况,您都可能得到重复。

    【讨论】:

      猜你喜欢
      • 2016-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多