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

时间:2019-01-31 12:13:54

标签: node.js

我正在使用Node.js通过以下公式生成序列密钥

yydddmmssMiMi

其中yy是用2位数字表示的年份,每年的ddd日,例如2月1日是032,mm分钟,ss秒,MiMi毫秒 031122312.这是示例代码

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个序列密钥

1 个答案:

答案 0 :(得分:2)

因此,在发表评论后,这是我的答案。希望它适合你。

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

${companyCode}${packingLevel}${companyLine}${year}${day}${hours}${minutes}${seconds}${milliseconds}

不幸的是,通过此公式生成的键不能以任何方式保证唯一性,因为它们完全取决于日期和时间。而且,这样的密钥很容易预测。

您的下一个问题是:

  

那我该如何建议我的管理者避免这种情况?

幸运的是,已经有此任务的解决方案,甚至还有一些standards

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

简单的代码示例:

const uuidv4 = require('uuid/v4');
uuidv4(); // ⇨ '10ba038e-48da-487b-96e8-8d3b99b6d18a'

这种方法将更加可靠,安全和方便。 如果由于某种原因他们仍然需要密钥的长度为20个符号-您可能只使用较长的uuid或Google的一部分,或者使用其他一些非标准的方法来生成这样的字符串。