Date epoch 是安全的唯一标识符吗?
Is Date epoch a secure unique identifier?
我正在编写一个节点 API 并得到一个模型,我必须为其生成一个 15 位随机数 。这必须是唯一的并且看起来不重要(我无法获得自动增量)。
我真的不想生成一个数字并查询 Mongo 数据库以进行存在性检查。我将不得不以这种方式基于承诺生成某种 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,但它们不仅仅是数字。
我认为这不是个好主意。原因之一是系统时间偏差。在与某些基准服务器同步时间后,您会得到重复项。事实上,这可能每隔几个小时就会在运行时发生一次。有些服务器时间漂移严重,每隔一段时间就会同步一次时间。任何时候发生这种情况,您都可以获得重复项。
为什么不使用 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);
使用时间生成唯一 ID 不安全。作为AK。建议你可能会因为同步不良而得到重复项。
如果没有数字不是关键,您应该使用基于 RFC4122 的 node-uuid 来生成唯一 ID。
我正在编写一个节点 API 并得到一个模型,我必须为其生成一个 15 位随机数 。这必须是唯一的并且看起来不重要(我无法获得自动增量)。
我真的不想生成一个数字并查询 Mongo 数据库以进行存在性检查。我将不得不以这种方式基于承诺生成某种 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,但它们不仅仅是数字。
我认为这不是个好主意。原因之一是系统时间偏差。在与某些基准服务器同步时间后,您会得到重复项。事实上,这可能每隔几个小时就会在运行时发生一次。有些服务器时间漂移严重,每隔一段时间就会同步一次时间。任何时候发生这种情况,您都可以获得重复项。
为什么不使用 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);
使用时间生成唯一 ID 不安全。作为AK。建议你可能会因为同步不良而得到重复项。
如果没有数字不是关键,您应该使用基于 RFC4122 的 node-uuid 来生成唯一 ID。