生成串行密钥Node.js重复问题
我使用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
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个字符的安全随机字符串。我想破折号使人更容易阅读/输入?加密通常用于不同的目的,如散列密码等。可能它适合这里,但我决定在我的示例中使用更通用的库。