生成串行密钥Node.js重复问题

生成串行密钥Node.js重复问题,node.js,Node.js,我使用Node.js使用以下公式生成序列键 yydddmmssMiMi 式中,yy为年份,单位为2位数字,ddd为一年中的日期,例如2月1日为032,毫米分,秒,米米毫秒 31122312下面是示例代码 exports.generateSerialKey = async () => { const date = new Date(); const year = date.getFullYear().toString().substr(2, 2); const day = d

我使用Node.js使用以下公式生成序列键

yydddmmssMiMi
式中,yy为年份,单位为2位数字,ddd为一年中的日期,例如2月1日为032,毫米分,秒,米米毫秒 31122312下面是示例代码

exports.generateSerialKey = async () => {

  const date = new Date();
  const year = date.getFullYear().toString().substr(2, 2);
  const day = dateOfYear();
  const hours = formatDate(date.getHours(), 2);
  let minutes = parseInt((new Date()).getMinutes(), 10);
  minutes = formatDate(minutes, 2);
  let seconds = parseInt((new Date()).getSeconds(), 10);
  seconds = formatDate(seconds, 2);
  await sleep(19);
  let milliseconds = Math.floor((new Date()).getMilliseconds());
  milliseconds = formatDate(milliseconds, 2).substr(0, 2);

  return  `${year}${day}${hours}${minutes}${seconds}${milliseconds}`;
 };

但问题是,当我同时点击同一个API时,串行键被重复。我必须在一个循环中生成10000多个串行键。所以,在评论中进行对话后,下面是我的答案。希望它适合你

正如我们在评论中提到的,您的管理层要求您使用由20个符号组成的串行密钥公式:

${companyCode}${packingLevel}${companyLine}${year}${day}${hours}${minutes}${seconds}${milliseconds}
不幸的是,通过这个公式生成的密钥不能保证唯一性,因为它们完全依赖于日期和时间。此外,这些关键点很容易预测

你的下一个问题是:

那么,我可以向我的管理层推荐什么来避免这种情况呢

幸运的是,这个任务已经有了解决方案,甚至还有一些

对于与nodeJS一起使用,我建议使用npm

代码的简单示例:

const uuidv4 = require('uuid/v4');
uuidv4(); // ⇨ '10ba038e-48da-487b-96e8-8d3b99b6d18a'
这种方法将更加可靠、安全和方便。
如果出于某种原因,他们仍然需要密钥长度为20个符号-您可能只需要使用较长uuid的一部分,或者使用google其他非标准方法来生成此类字符串。

是否需要此类格式的串行密钥?是的,这是业务要求,串行密钥的总长度为20 btw。串行密钥中必须只包含数字?是@ArtemArkhipov这里是完整的公式
${companyCode}${packingLevel}${companyLine}${year}${day}${hours}${minutes}${ms}
公式说明:
4 companyCode+1打包级别+2行代码+2年(如18)+一年中的3天(如一年中的324天)+2小时(如22或23或09)+2分钟+2秒+2毫秒
通过此公式生成的密钥不能保证唯一性,因为它仅取决于时间。而且很容易预测,这是一个很好的答案。一个问题,有没有理由在内置加密库中使用这个
require('crypto')。randomBytes(10)。toString(“hex”)
将生成一个20个字符的安全随机字符串。我想破折号使人更容易阅读/输入?加密通常用于不同的目的,如散列密码等。可能它适合这里,但我决定在我的示例中使用更通用的库。