Как разложить число в PHP?
Можно без перебора всех вариантов стразу получать искомые IP-адреса - если идти не от чисел, а от суммы цифр каждого числа.
В результате скрипт, в котором echo было заменено на ++$count, проработал менее 14 секунд и насчитал 112279695 адресов.
$tbl = array_fill(0, 20, []);
for ($i = 0; $i < 256; ++$i) { $tbl[intdiv($i, 100) + intdiv($i, 10) % 10 + $i % 10][] = $i; }
for ($i = 0; $i <= 19; ++$i) {
    for ($j = 0; $j <= min(19, 28 - $i); ++$j) {
        for ($k = max(0, 28 - 19 - $i - $j); $k <= min(19, 28 - $i - $j); ++$k) {
            foreach($tbl[$i] as $v1) {
                foreach($tbl[$j] as $v2) {
                    foreach($tbl[$k] as $v3) {
                        foreach($tbl[28 - $i - $j - $k] as $v4) {
                            echo $v1, '.', $v2, '.', $v3, '.', $v4, "\n";
                        }
                    }
                }
            }
        }
    }
}
Сумма цифр числа в диапазоне 0..255 имеет диапазон значений от 0 (0) до 19 (199).
$tbl - массив списков чисел в диапазоне 0..255, имеющих одинаковую сумму цифр.
192.168.0.1
Это алфавит от 0 до 255.
Перестановки - это анаграмма для слова из 4-х букв.
Можно сделать хеш через простые числа:
0 -> 2
1 -> 3
2 -> 5
3 -> 7
...
255 -> ...Затем перемножить простые 4-е числа (справа от стрелки), соответствующие одному из 4-х значений (от 0 до 255: A.B.C.D) в ip-адресе: результат при любой перестановке всегда будет одинаковым.