このjavascriptパスワード生成機能があります。現在、選択した仕様に一致しないパスワードを破棄しています。たとえば、パスワードに数字が含まれていない場合は、それを破棄して、数字が含まれる新しいパスワードを生成します。ただし、これは効率的なパフォーマンス万力ではないようです。少なくとも私にはそうではありません。
生成されたパスワードに特定の文字を強制的に実装するより良い方法はありますか?
また、パスワードに特殊文字を強制的に含めることができるように追加する予定です。これを現在の方法で行うと、パスワードに特殊文字が含まれているかどうかを確認し、そうでない場合はそれをスローするために正規表現が必要になります(これもあまり効率的ではないようです)。
function generatePassword(length, charset, nosimilar) {
// default parameters
length = (typeof length === "undefined") ? 8 : length;
charset = (typeof charset === "undefined") ? 'abcdefghjknpqrstuvwxyzABCDEFGHJKLMNPQRSTUVWXYZ123456789' : charset;
nosimilar = (typeof similar === "undefined") ? true : nosimilar;
var gen;
retVal = "";
for (var i = 0, n = charset.length; i < length; ++i) {
gen = charset.charAt(Math.floor(Math.random() * n))
if ( (retVal.charAt( retVal.length-1 ) == gen) && (nosimilar)) {
retVal = retVal.substring(0, retVal.length - 1)
retVal += charset.charAt(Math.floor(Math.random() * n))
console.log('Generated character same as the last one. Trunkated and regenerated.');
}
retVal += gen;
}
// if charset contains numbers make sure we get atleast one number
if ( (retVal.match(/\d+/g) == null) && (charset.match(/\d+/g) != null)) {
console.log('Password generated but no numbers found. Regenerating.');
generatePassword(length, charset, nosimilar);
}
return retVal;
}
if ($("#chLetters").prop('checked')) charset += 'abcdefghjknpqrstuvwxyz';
if ($("#chNumbers").prop('checked')) charset += '123456789';
if ($("#chMixedCase").prop('checked')) charset += 'ABCDEFGHJKLMNPQRSTUVWXYZ';
if ($("#chSpecial").prop('checked')) charset += '!@$%&?+*-_';
$("#passgen").text(generatePassword($("#maxLength").val(), charset, $("#chNoSimilar").prop('checked')));