Картинка блога

Это маленький, но полезный метод для генерации словарей путем перебора всех возможных последовательностей, может быть полезен для:

  • Подбора паролей.
  • Проверки доменов
  • Генерации имен

Для оптимизации памяти, по хорошему, нужно использовать yield.

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;

namespace NameGen
{
    class Program
    {
        static string alpha = "abcdefghijklmnopqrstuvwxyz";
        static string num = "0123456789";

        static void Main(string[] args)
        {
            var output = @"C:\__autoSeo_results\names";
            File.Delete(output);

            List<string> elements = Generate(alpha);
            File.WriteAllLines(output, elements);
        }

        static List<string> Generate(string chars, int len = 3)
        {
            int size = (int) Math.Pow(chars.Length, len);
            List<string> elements = new List<string>(size);
            int[] counters = new int[len];

            do
            {
                elements.Add(new string(counters.Select(x=>chars[x]).ToArray()));
                counters[0]++;
                for (int i = 0; i < len; i++)
                {
                    if (counters[i] == chars.Length)
                    {
                        if (i + 1 == len) return elements;
                        counters[i + 1]++;
                        counters[i] = 0;
                    }

                }
            } while (true);
        }
    }
}

Метки:,

4 комментария в “Генерация строк перебором букв.”

  1. Зачем объявлена переменная num, если она не используется?

  2. Зато её можно передать в метод как параметр :p

  3. Да, с использованием yield return программа станет немного проще.


    using System;
    using System.Collections.Generic;
    using System.Text;

    namespace DictGenerator
    {
    class Program
    {
    public static IEnumerable EnumLetter(string alphabet)
    {
    foreach (char a in alphabet)
    yield return "" + a;
    }

    public static IEnumerable EnumWord(IEnumerable child, string alphabet)
    {
    foreach (string a in child)
    foreach (string b in EnumLetter(alphabet))
    yield return "" + a + b;
    }

    static void Main(string[] args)
    {
    const string alphabet = "abcdefghijklmnopqrstuvwxyz";
    int length = 5;

    IEnumerable list = EnumLetter(alphabet);
    for (int i = 0; i < length - 1; i++)
    list = EnumWord(list, alphabet);

    foreach (string a in list)
    {
    Console.WriteLine(a);
    }
    }
    }
    }

  4. Соль, использованную для каждого пароля мы храним рядом с полученным хешем, например, в отдельном столбце таблицы паролей. Когда нам необходимо проверить пароль пользователя — мы извлекаем соль, соединяем с введенным паролем и находим от этой строки MD5. Если пароль верный — хеш совпадет с тем, который хранится в базе.