powered by simpleCommunicator - 2.0.29     © 2024 Programmizd 02
Map
Форумы / Java [игнор отключен] [закрыт для гостей] / Как оптимально перебрать все комбинации 4х массивов?
22 сообщений из 22, страница 1 из 1
Как оптимально перебрать все комбинации 4х массивов?
    #40111784
Samantata
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Пытаюсь написать небольшую программку на Java которая сгенерирует абсолютно все возможные варианты IP адресов.
от 0.0.0.0 до 255.255.255.255 на реальность проверять не надо. просто перебрать числа.

сохранять будет в файлы, с этим проблем нет.

пыталась с помощью циклов for но получается какое-то дикое спагетти с неконтролируемым результатом.

Подскажите пожалуйста, какой самый аккуратный способ это сделать? Может есть какие-то библиотеки для таких случаев?
...
Рейтинг: 0 / 0
Как оптимально перебрать все комбинации 4х массивов?
    #40111787
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: java
1.
2.
3.
4.
цикл
 от минимальное.целое
 до максимальное.целое
 делать печать_адреса

?
...
Рейтинг: 0 / 0
Как оптимально перебрать все комбинации 4х массивов?
    #40111799
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Samantata, твоя задача - это просто перевод любого числа в 256-ричную систему счисления.
Любой учебник информатики и вычислительной техники 20-го века всегда содержал главу
на эту тему. Почитай там легко.
...
Рейтинг: 0 / 0
Как оптимально перебрать все комбинации 4х массивов?
    #40111823
Samantata, IP Address - это 4х байтовый int. Т.е.
1. Делаем цикл по всем значениям int
2. Переводим int в массив байт
3. Переводим массив байт в строку

Получается достаточно лаконично:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
    public static void main(String[] args) {
        for (int i = 0; i != -1; i++) {
            byte[] bytes = toBytes(i);
            System.out.println(ipToString(bytes));
        }
    }
    static byte[] toBytes(int v) {
        byte[] bytes = new byte[4];
        for (int i = bytes.length - 1; i >= 0; i--) {
            bytes[i] = (byte) (v & 0xff);
            v >>>= 8;
        }
        return bytes;
    }
    static String ipToString(byte[] ip) {
        StringBuilder s = new StringBuilder();
        for (byte b : ip)
            s.append(Byte.toUnsignedInt(b)).append(".");
        s.deleteCharAt(s.length() - 1);
        return s.toString();
    }
...
Рейтинг: 0 / 0
Как оптимально перебрать все комбинации 4х массивов?
    #40111831
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
так короче
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
    public static void main(String[] args) {
        for (int i = 0; i != 1024; i++) {
            StringBuilder s = new StringBuilder(15);
            s
              .append(Byte.toUnsignedInt((byte) (i >>> 24 & 0xff))).append(".")
              .append(Byte.toUnsignedInt((byte) (i >>> 16 & 0xff))).append(".")
              .append(Byte.toUnsignedInt((byte) (i >>> 8 & 0xff))).append(".")
              .append(Byte.toUnsignedInt((byte) (i & 0xff)));

            System.out.println(s.toString());
        }
    }
...
Рейтинг: 0 / 0
Как оптимально перебрать все комбинации 4х массивов?
    #40111834
вадя , если хочется короче тогда:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
    public static void main(String[] args) {
        for (int i = 0; i != -1; i++)
            System.out.println(
                    Byte.toUnsignedInt((byte) (i >>> 24 & 0xff)) + "." +
                    Byte.toUnsignedInt((byte) (i >>> 16 & 0xff)) + "." +
                    Byte.toUnsignedInt((byte) (i >>> 8 & 0xff)) + "." +
                    Byte.toUnsignedInt((byte) (i & 0xff)));
    }

i все равно должен доходить до -1.
...
Рейтинг: 0 / 0
Как оптимально перебрать все комбинации 4х массивов?
    #40111839
вадя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stanislav Bashkyrtsev
i все равно должен доходить до -1.
это у меня осталось от проверки

тогда уж так
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
    public static void main(String[] args) {
        for (int i = 0; i != -1; i++)
           System.out.println(
                    (i >>> 24 & 0xff) + "."
                    + (i >>> 16 & 0xff) + "."
                    + (i >>> 8 & 0xff) + "."
                    + (i & 0xff));
         
    }
...
Рейтинг: 0 / 0
Как оптимально перебрать все комбинации 4х массивов?
    #40112052
faustgreen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
При выполнении примера увеличение крайней левой части IP адреса на 1 у меня занимало ~1,5 минуты.
1,5 * 255 ~ 382 минут ~ 6 часов.

Можно ли как то улучшить performance?
...
Рейтинг: 0 / 0
Как оптимально перебрать все комбинации 4х массивов?
    #40112055
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы эти несчастные IP-адреса на доступность проверяете?
А зачем?
...
Рейтинг: 0 / 0
Как оптимально перебрать все комбинации 4х массивов?
    #40112261
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Samantata,

Тебе надо посчитать от 0x0 до 0xFFFFFFFF? Но зачем
...
Рейтинг: 0 / 0
Как оптимально перебрать все комбинации 4х массивов?
    #40112262
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
faustgreen
Можно ли как то улучшить performance?

Можно. Убери System.out.println или запускай не из иде, а из терменала с перенаправлением стандартного вывода в файл.
...
Рейтинг: 0 / 0
Как оптимально перебрать все комбинации 4х массивов?
    #40112266
PetroNotC Sharp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
crutchmaster
Samantata,

Тебе надо посчитать от 0x0 до 0xFFFFFFFF? Но зачем
)))
...
Рейтинг: 0 / 0
Как оптимально перебрать все комбинации 4х массивов?
    #40112268
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
faustgreen
При выполнении примера увеличение крайней левой части IP адреса на 1 у меня занимало ~1,5 минуты.
1,5 * 255 ~ 382 минут ~ 6 часов.

Можно ли как то улучшить performance?

Из 4х миллиардов целых чисел адресное пространство IPv4 реально использует что-то около 3 млрд.
Все остальные номера - фейки.

Тормозит у тебя скорее всего вывод в консоль. (Это был-бы забавный вопрос на собеседовании.)
Уж если ты взялась за оптимизации - то надо понимать что I/O - это первый кандидат на узкое
место в численных методах.

Перепиши на FileOutputStream (с буфером) и замеряй снова производительность.
...
Рейтинг: 0 / 0
Как оптимально перебрать все комбинации 4х массивов?
    #40112466
xipafi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mayton,спасибо
...
Рейтинг: 0 / 0
Как оптимально перебрать все комбинации 4х массивов?
    #40112467
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Basil A. Sidorov
А зачем?

Я думаю, он весь интернет решил просканировать на наличие открытых портов. Вот сейчас будет в n потоков на жабке делать свой вело-nmap.
...
Рейтинг: 0 / 0
Как оптимально перебрать все комбинации 4х массивов?
    #40112469
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Он (она) студентка. И изучает основы.
...
Рейтинг: 0 / 0
Как оптимально перебрать все комбинации 4х массивов?
    #40112470
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вадя,
Stanislav Bashkyrtsev,

А что убрали стрингбилдер, я не понял? Научите сейчас ребенка плохому.
...
Рейтинг: 0 / 0
Как оптимально перебрать все комбинации 4х массивов?
    #40112524
crutchmaster
вадя,
Stanislav Bashkyrtsev,

А что убрали стрингбилдер, я не понял? Научите сейчас ребенка плохому.
Во время компиляции "+" как раз заменится на StringBuilder. Так что конкатенация == StringBuilder.

Но если бы мы конкатенировали в несколько выражений, то на каждую строку создавался бы StringBuilder, что не эффективно:
Код: java
1.
2.
3.
        String s = "";
        s += "b";
        s += "c";

И в таком случае да - нужно создавать StringBuilder явно.
...
Рейтинг: 0 / 0
Как оптимально перебрать все комбинации 4х массивов?
    #40112552
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ручное включение StringBuilder для новичка не является ошибкой.
Но вот обосновать возможность отключения стринг-билдера без потерь для перформанса - это задача для опытного.

Лучше пускай Samantata использует StringBuilder явно.
...
Рейтинг: 0 / 0
Как оптимально перебрать все комбинации 4х массивов?
    #40112564
Basil A. Sidorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тормозит вывод на терминал? Рылли?При выполнении примера увеличение крайней левой части IP адреса на 1 у меня занимало ~1,5 минуты.
1,5 * 255 ~ 382 минут ~ 6 часов.
...
Рейтинг: 0 / 0
Как оптимально перебрать все комбинации 4х массивов?
    #40112629
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Также IPv4 могут быть представлены в виде hex-нотации. Что как-бы делает данную (в топике) активность
как минимум странной.
...
Рейтинг: 0 / 0
Как оптимально перебрать все комбинации 4х массивов?
    #40112717
Фотография crutchmaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Stanislav Bashkyrtsev
И в таком случае да - нужно создавать StringBuilder явно.

Интересно. Это с 8-й версии явы работает?
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Как оптимально перебрать все комбинации 4х массивов?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]