我参与了一个项目,我们使用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);
};
我们如何改进此程序,或改变它以实现目标?
答案 0 :(得分:3)
您可以通过选择初始ObjectId(表中最旧的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)
&#13;