我想循环所有密码
循环a-z   A-Z   0-9   
自己的办法训话太可怕了。
递归可能会很简单吧,太乱了。希望帮忙下。希望写个方法2个参数,第一个是从几位,第二个是到几位返回字符窜,想学习下你们是什么算法

解决方案 »

  1.   

    全排列
    http://topic.csdn.net/u/20090217/21/f41ed9f6-f929-451c-a5c9-80d2e408422a.html
      

  2.   

    google 36进制算法。从1开始,到无穷大,获得每个数字的36进制编码,就是你要的字典。
      

  3.   


            private static char[] charSet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ".ToCharArray();
            //private static string[] charSet = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
            //                                      "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", 
            //                                      "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", 
            //                                      "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M",
            //                                      "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };        /// <summary>
            /// 将指定数字转换为指定长度的62进制
            /// </summary>
            /// <param name="value">要转换的数字</param>
            /// <param name="length">需要的长度</param>
            /// <returns>62进制表示格式</returns>
            public static string ConvertTo62(long value, int length)
            {
                string sixtyNum = string.Empty;
                if (value < 62)
                {
                    sixtyNum = charSet[value].ToString().PadLeft(length, '0');
                }
                else
                {
                    long result = value;
                    //char[] ch = new char[length];
                    while (result > 0)
                    {
                        long val = result % 62;
                        //ch[--length] = charSet[val];
                        sixtyNum = charSet[val] + sixtyNum;
                        result = result / 62;
                    }
                    sixtyNum = sixtyNum.PadLeft(length, '0');
                    //for (int i = 0; i < length; i++)
                    //{
                    //    ch[i] = '0';
                    //}
                    //sixtyNum = new string(ch);
                }
                return sixtyNum;
            }
            public static void Main()
            {
                Stopwatch sw = new Stopwatch();
                sw.Start();
                int pwdLength = 5;//要遍历多少位的密码
                //5位62进制的最小值是62的4次方(10000),最大值就是62的5次方-1(ZZZZZ)
                //从00000到ZZZZZ
                long maxNum = (long)Math.Pow(62, pwdLength);
                for (long i = 0; i < maxNum; i++)
                {
                    Console.WriteLine(ConvertTo62(i, pwdLength));
                }
                sw.Stop();
                Console.WriteLine("总运行时间:" + sw.Elapsed);
            }
    采用62进制的方式实现,定义和运算的时候使用char要快点。
      

  4.   


            /// <summary>
            /// 遍历指定位数之间的所有组合
            /// </summary>
            /// <param name="minLength">最短位数</param>
            /// <param name="maxLength">最长位数</param>
            public static void testPassword(int minLength, int maxLength)
            {
                for (int i = minLength; i <= maxLength; i++)
                {
                    long maxNum = (long)Math.Pow(62, i);
                    for (long j = 0; j < maxNum; j++)
                    {
                        Console.WriteLine(ConvertTo62(j, i));
                    }
                }
            }
    testPassword(5, 8);//将输出5--8位所有组合
      

  5.   


    是的,比如10进制我们要循环3位数的所有组合,只需要挨着跑一次就OK了。
    000--999(000,001,002,003100,101,102。998,999)
    从0到10的2次方-1因为0-9,a-z,A-Z共62个字符,我们用62进制来跑一次,就可以涵盖所有组合了。
      

  6.   


    开玩笑,怎么可能只有这些字母?!还有各种符号(例如_、-、+)以及其它字符(例如TAB对应的),以及罗马字、中国字、日文等等,这些都可以作为密码使用的字符。
      

  7.   


    哥们,能看看我代码么?挂机一会就出现发生错误,关闭什么的。
    发送错误信息,百度下说什么内存溢出还是什么,应该是这个密码循环多了的问题?
    我模拟post提交用了很久了没出现什么问题啊