|
|
|
|
|
для: Trianon
(21.08.2009 в 18:09)
| | Ну в этом смысле да. | |
|
|
|
|
|
|
|
для: Саня
(21.08.2009 в 17:15)
| | Собственно, при тестировании только одного IP-адреса, можно оставить и так.
Но если проверить нужно целый пакет - стоит изменить структуру хранения набора подсетей.
Вообще же для искомых данных сама собой напрашивается структура древовидного поиска. | |
|
|
|
|
|
|
|
для: Trianon
(21.08.2009 в 17:02)
| | Не могу придумать ничего эффективнее. Разве что вызов сторонней программы, написанной на асме. | |
|
|
|
|
|
|
|
для: Саня
(21.08.2009 в 15:03)
| | Эффективность... | |
|
|
|
|
|
|
|
для: Trianon
(21.08.2009 в 14:55)
| | Что? | |
|
|
|
|
|
|
|
для: Саня
(21.08.2009 в 11:31)
| | :-( | |
|
|
|
|
 3.3 Кб |
|
|
для: annonymоus
(21.08.2009 в 12:45)
| | Отличаются несильно. При параметрах теста "ab -n 100000 -c 5 http://localhost/test.php" мой скрипт показал 1688.21 запросов/сек, ваш — 1570.55. Всё же сказывается разница между стандартной, специально заточенной для IP функцией и регвырами. | |
|
|
|
|
автор: annonymоus (21.08.2009 в 12:45) |
|
|
для: Саня
(21.08.2009 в 11:31)
| | понял в чём была моя ошибка :)
не использовал ip2long и $k нужно было каждый раз умножать на 8
надо-бы сравнить по скорости
<?
$list= array('8.2.144.0/24','12.8.167.0/24','12.18.210.0/24',
'12.23.142.0/24','12.26.226.0/23','12.27.222.0/23',
'12.107.230.0/24','12.107.239.0/24','12.107.246.0/23',
'13.4.8.0/22','13.7.0.0/16','13.7.64.0/24',
'24.72.248.0/21 ','24.107.160.0/20 ');
// искомый IP
$target = ip2long('24.107.160.255');
function s2ip(&$m) {
global $target;
$ip = ($m[1]<<24 |($m[2]<<16) |($m[3]<<8) | $m[4]);
$mask = -1<<(32-$m[5]);
if (($target & $mask) == ($ip & $mask)) echo 'ip принадлежит подсети "'. $m[0] ."\"\n\n";
return '';
}
preg_replace_callback(
'#(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})/(\d{1,2})\s*#',
's2ip',
$list);
?> | |
|
|
|
|
|
|
|
для: annonymоus
(21.08.2009 в 10:28)
| |
<?
$ip = '8.2.144.200';
$mask = -1 << 32 - 24;
$long = ip2long('8.2.144.200');
print 'CIDR-адрес: '.$ip.'/24<br/>'
.'Маска: '.long2ip($mask).'<br/>'
.'Подсеть: '.long2ip($long & $mask);
|
| |
|
|
|
|
|
|
|
для: Trianon
(21.08.2009 в 10:44)
| |
<?php
// список подсетей
$list = array('8.2.144.0/24', '12.8.167.0/24', '12.18.210.0/24',
'12.23.142.0/24', '12.26.226.0/23', '12.27.222.0/23',
'12.107.230.0/24', '12.107.239.0/24', '12.107.246.0/23',
'12.107.248.0/23', '12.107.250.0/23', '12.169.52.0/24',
'12.180.224.0/24', '12.191.164.0/22', '13.0.0.0/16',
'13.1.0.0/16', '13.2.0.0/16', '13.3.0.0/16',
'13.4.8.0/22', '13.7.0.0/16', '13.7.64.0/24',
'24.72.248.0/21', '24.107.160.0/20');
// искомый IP
$target = '12.107.249.10';
// искомый IP в long формате
$target_long = ip2long($target);
// прочёсываем все подсети
foreach ( $list as $subnet_mask ) {
// отделяем маску от подсети
list($subnet, $mask) = explode('/', $subnet_mask);
$subnet = ip2long($subnet);
$mask = 4294967295 << 32 - $mask; // полная маска
$max = $subnet | ~$mask; // максимальный IP в диапазоне
if ( $target_long >= $subnet && $target_long <= $max
|| $target_long <= $subnet && $target_long >= $max ) {
print $target.' принадлежит подсети '.$subnet_mask;
break;
}
}
|
??? | |
|
|
|
|