给定一个字符集以及密码长度,遍历所有密码样本,并形成密码字典,因为采用的是递归函数,速度非常快。
/// <summary>
/// 采用递归的方式创建密码字典
/// </summary>
/// <param name="list">字典</param>
/// <param name="first">前缀</param>
/// <param name="second">字符集</param>
/// <param name="size">密码长度</param>
/// <param name="repeat">单个字符的允许重复次数</param>
private static void Gen(List<string> list, string first, string second, int size, int repeat)
{
if (_isOver) return;
//长度为0则递归结束
if (size <= 0) return;
for (int i = 0; i < second.Length; i++)
{
//密码长度已经达到
if (size == 1)
{
//密码是否合格的标志
bool flag = false;
//当前密码
string str = first + second[i];
//检查密码的单个字符是否超过允许的重复次数
for (int j = 0; j < str.Length; j++)
{
int num = 1;
for (int k = j + 1; k < str.Length; k++)
{
if (str[j] == str[k]) num++;
}
if (num > repeat)
{
flag = true;
break;
}
}
//检查没问题则添加到密码字典
if (!flag) list.Add(str);
}
//密码长度还不够,继续递归
else Gen(list, first + second[i], second, size - 1, repeat);
}
}
下面用一个函数对它进行包装:
/// <summary>
/// 给定前缀和字符集创建密码字典
/// </summary>
/// <param name="prefix">密码前缀</param>
/// <param name="symbols">字符集</param>
/// <param name="size">密码和长度</param>
/// <param name="repeat">单个字符的允许重复次数</param>
/// <returns>密码字典</returns>
private static List<string> CreatSample(string prefix, string symbols, int size, int repeat)
{
List<string> ret = new List<string>();
if (size <= 0) return ret;
Gen(ret, prefix, symbols, size, repeat);
return ret;
}