【问题标题】:Javascript (node.js) Specific Random String Builder [duplicate]Javascript(node.js)特定的随机字符串生成器[重复]
【发布时间】:2013-06-09 22:34:38
【问题描述】:

我正在寻找一种有效的方法来构建具有特定要求但长度可能不同的随机字符串。它必须

  • 至少包含一个大写字符。
  • 至少包含一个小写字符。
  • 至少包含一个数字。
  • 至少包含一个特殊字符: _-|@.,?/!~#$%^&*(){}[]+=

随机字符串不必是唯一的,但如果是,那就更好了。它将在 node.js 服务器中使用,因此可以使用任何加密库。我看到了Math.random().toString(36),它很接近但并没有让我明白一切。我不确定我是否应该尝试为此构建一个正则表达式。

【问题讨论】:

  • 正则表达式将用于验证您的字符串/要求。它不会生成字符串。
  • 加密总是使用crypto.randomBytes()

标签: javascript node.js random


【解决方案1】:
var randomString = (function() {
  // Define character classes to pick from randomly.
  var uppers = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  var lowers = 'abcdefghijklmnopqrstuvwxyz';
  var numbers = '0123456789';
  var specials = '_-|@.,?/!~#$%^&*(){}[]+=';
  var charClasses = [uppers, lowers, numbers, specials];
  var minLen = charClasses.length;
  function chooseRandom(x) {
    var i = Math.floor(Math.random() * x.length);
    return (typeof(x)==='string') ? x.substr(i,1) : x[i];
  }
  // Define the function to actually generate a random string.
  return function(maxLen) {
    maxLen = (maxLen || 36);
    if (maxLen < minLen) { throw new Error('length must be >= ' + minLen); }
    do { // Append a random char from a random char class.
      var str='', usedClasses={}, charClass;
      while (str.length < maxLen) {
        charClass = chooseRandom(charClasses);
        usedClasses[charClass] = true;
        str += chooseRandom(charClass);
      }
      // Ensure we have picked from every char class.
    } while (Object.keys(usedClasses).length !== charClasses.length);
    return str;
  }
})();

randomString(); // => "o4m3H@YC7j0r@^gsY@1vlg2]cI66|9^beZ1)"
randomString(); // => "R6-K0Kq%4O0Je*=iPbVaV|bo-_,,g[j8wTW2"
randomString(); // => "!uu5NUWs1P}SRN78l}32Gno$]2m5PV+h+wTG"

【讨论】:

  • 是否需要 forEach 循环?似乎只是将前几个字符限制为一定的顺序(第一个是上,第二个是下等)
  • @thearchitect:更新以移除 forEach 循环。
  • @thearchitect:我添加了您提取“minLen”常量的想法。
  • 太好了,谢谢 :) 工作得很好!
【解决方案2】:

正则表达式用于检查、捕获、拆分或替换字符串中的某些内容,您不能用它们从零开始构建某些内容。

但是,您可以在包含随机生成的数字的字符串中进行一些替换,以获得您想要的。

【讨论】:

  • 我想到了这一点,但如果我只是替换字符,它会失去一定程度的独特性。 ATM 我正在​​尝试 Math.random() 来构建字符串。
猜你喜欢
  • 2015-12-29
  • 2015-08-16
  • 2017-04-11
  • 2017-04-05
  • 2010-12-07
  • 2013-05-31
  • 2011-11-20
  • 1970-01-01
相关资源
最近更新 更多