本工具可根据用户自定义配置,生成指定格式及数量的密码!
- 可包含:数字,大/小写字母,特殊字符
- 可设置字符不重复
- 可指定生成密码位数
- 可指定一次生成密码的数量
源码讲解
显定义用于生成密码的字符。包含数字,大/小写字母,以及特殊字符。 下面详细分析它的结构和关键逻辑:
函数定义
export function useGeneratePassword(selected: PwdType[], length: number, count: number)
这个函数名为 useGeneratePassword,接收三个参数:
- selected: 一个- PwdType类型的数组,指定密码中包含的字符类型。
- length: 密码的长度。
- count: 要生成的密码数量。
类型定义
type PwdType = 'digits' | 'lowercase' | 'uppercase' | 'specials' | 'norepeat'
PwdType 是一个类型别名,定义了五种可能的字符串值,用于指示密码生成策略。
字符集初始化
let characters = ''
if (selected.includes('digits'))
  characters += digits
if (selected.includes('lowercase'))
  characters += lowercaseLetters
if (selected.includes('uppercase'))
  characters += uppercaseLetters
if (selected.includes('specials'))
  characters += specialCharacters
这部分代码基于 selected 数组的值来构建 characters 字符串,这个字符串包含了所有可能用于生成密码的字符。
密码生成循环
const passwords = []
for (let i = 0; i < count; i++) {
  let password = ''
  const availableChars = characters
  for (let j = 0; j < length; j++) {
    const charIndex = Math.floor(Math.random() * characters.length)
    password += characters[charIndex]
    if (selected.includes('norepeat') && characters.length > 1)
      characters = characters.slice(0, charIndex) + characters.slice(charIndex + 1)
  }
  passwords.push(password)
  if (selected.includes('norepeat'))
    characters = availableChars
}
return passwords
这个循环生成 count 个密码。每个密码通过随机选择 characters 字符串中的字符来构建,长度为 length。如果选择了 'norepeat' 选项,将确保密码中不会重复使用字符。
重要的知识点
- 字符串操作:使用 +=来合并字符串,用slice()方法在不重复字符的情况下处理字符串。
- 数组操作:通过 includes()方法检查数组中是否包含某个特定值。
- 随机数生成:使用 Math.random()和Math.floor()来选择随机字符。
- 条件逻辑:通过条件语句来决定是否包含某些字符类型或者是否允许字符重复。
问题与潜在改进
- 当选项包含 norepeat而characters长度小于length时,这段代码可能进入无限循环或者无法生成所需长度的密码。需要增加逻辑以确保length不超过characters的长度。
- 代码中对 characters的修改可能会导致意外的行为,特别是在处理字符不重复的逻辑时。