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

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

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

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

?
...
Рейтинг: 0 / 0
13.11.2021, 23:48
    #40111799
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимально перебрать все комбинации 4х массивов?
Samantata, твоя задача - это просто перевод любого числа в 256-ричную систему счисления.
Любой учебник информатики и вычислительной техники 20-го века всегда содержал главу
на эту тему. Почитай там легко.
...
Рейтинг: 0 / 0
14.11.2021, 10:56
    #40111823
Как оптимально перебрать все комбинации 4х массивов?
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
14.11.2021, 12:02
    #40111831
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимально перебрать все комбинации 4х массивов?
так короче
Код: 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
14.11.2021, 12:34
    #40111834
Как оптимально перебрать все комбинации 4х массивов?
вадя , если хочется короче тогда:
Код: 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
14.11.2021, 12:43
    #40111839
вадя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимально перебрать все комбинации 4х массивов?
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
15.11.2021, 13:05
    #40112052
faustgreen
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как оптимально перебрать все комбинации 4х массивов?
При выполнении примера увеличение крайней левой части IP адреса на 1 у меня занимало ~1,5 минуты.
1,5 * 255 ~ 382 минут ~ 6 часов.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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