我正在使用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个序列密钥
答案 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的一部分,或者使用其他一些非标准的方法来生成这样的字符串。