2 个字节的最大值为 65535,所以如果你只使用 2 个字节,你永远不会得到 6 位数字。
改为使用 3 个字节,然后使用以下方法将其减少到 6 位substr
:
var crypto = require('crypto');
crypto.randomBytes(3, function(err, buffer) {
console.log(parseInt(buffer.toString('hex'), 16).toString().substr(0,6));
});
另一种解决方案是执行randomBytes
,直到你得到一个 6 位数的值:
var crypto = require('crypto');
var secureVal = 0;
function generateSecureVal(cb) {
crypto.randomBytes(3, function(err, buffer) {
secureVal = parseInt(buffer.toString('hex'), 16);
if (secureVal > 999999 || secureVal < 100000) {
generateSecureVal(cb);
} else {
cb();
}
});
}
generateSecureVal(function(){
console.log(secureVal);
});
上面的问题是理论上它可能会陷入一个永无止境的循环,而且它很可能会比第一个例子使用更多的 CPU 周期。