给定字符集以及密码长度创建密码字典

该博客介绍如何根据给定的字符集和密码长度,利用递归算法高效地生成完整的密码字典,实现快速遍历所有可能的密码样本。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

给定一个字符集以及密码长度,遍历所有密码样本,并形成密码字典,因为采用的是递归函数,速度非常快。

    /// <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;
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值