【问题标题】:Get unique int from MongoDB ObjectId in JavaScript(NodeJS)?从 JavaScript(NodeJS)中的 MongoDB ObjectId 获取唯一的 int?
【发布时间】:2016-03-09 08:33:42
【问题描述】:

我参与了一个项目,我们使用 MongoDB 作为主数据库系统,使用 JavaScript/NodeJS 作为服务器端。我们需要与外部合作伙伴进行整合。

我们合作伙伴的 API 要求操作编号应该是唯一的整数值。我们决定使用来自ObjectId 的 4 字节时间戳和 3 字节随机增量值的组合,但结果数字太高,我们失去了精度。

流程如下

var getUniqueIntFromObjectId = function (object_id) {
    var res = null;
    object_id = object_id.toString();
    res = parseInt(object_id.substring(0, 8), 16).toString() + parseInt(object_id.substring(18, 24), 16).toString();
    return parseInt(res, 10);
};

我们如何改进这个程序,或改变它以实现目标?

【问题讨论】:

  • 使用 'bignumber.js' npm 模块解析整数值。使用“var BigNumber = require('bignumber.js');x = new BigNumber(123.4567)”
  • api 要求的整数大小是多少? 32位? 64位? 128位?当它是 96 位或更多时,您可以将 ObjectId 的十六进制表示转换为整数。

标签: javascript mongodb computer-science


【解决方案1】:

您可以通过选择一个初始 ObjectId(表中最旧的)来获得一个有效整数,并使用它来偏移前 4 个字节中的时间戳。这会给你一个更小的数字,它是一个有效的整数,而不会失去唯一性。或者,您可以将初始 ObjectId 设置为 500000000000000000000000,对应于 2012-07-13T11:01:20.000Z

var getUniqueIntFromObjectId = function (object_id) {
    var res = null;
    object_id = object_id.toString();
    var firstObjectId='5661728913124370191fa3f8'
    var delta = parseInt(object_id.substring(0, 8), 16)-parseInt(firstObjectId.substring(0, 8),16)
    res = delta.toString() + parseInt(object_id.substring(18, 24), 16).toString();
    return parseInt(res, 10);
};

document.write("Unique integer: <br>" + getUniqueIntFromObjectId("56618f7d0000000000000000"))
document.write('<br/>')
document.write("Max safe integer: <br>"+Number.MAX_SAFE_INTEGER)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 2020-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多