У меня есть приложение PHP, которое должно хранить адреса IPv6 в отсортированном порядке. Я написал операцию сравнения для адресов IPv6, которая использует библиотечные функции «inet» и «gmp», но я ищу более эффективный способ сделать это — в идеале, работая напрямую с 16-байтовым упакованным строковым представлением адреса IPv6 , Есть ли удобный способ сделать это (без компиляции собственного расширения PHP)?
РЕДАКТИРОВАТЬ: Я заинтересован в обоих время а также пространство эффективность, вот почему меня привлекает идея использования упакованного строкового представления. И хотя я знаю, что существуют причудливые основанные на триях представления наборов IPv6, используемые маршрутизаторами для оптимизации определенных операций поиска, я не прошу ссылки на какие-либо библиотеки C или исследовательские работы по этому вопросу. Я спрашиваю конкретно о сортировке в PHP, которая сильно отличается от сортировки в C, Perl или Python. Номер адреса для управления < 100 миллионов, но более 1 миллиона.
Как отметил Майкл Хэмптон в комментариях, sort () и ksort () должны отлично работать на упакованных строках. Вот сценарий для демонстрации:
<?php
if (defined('AF_INET6')) {
echo "PHP was compiled without --disable-ipv6 option";
} else {
echo "PHP was compiled with --disable-ipv6 option";
}
$a = array(
inet_pton('::1'),
inet_pton('1::'),
inet_pton('::a'),
inet_pton('a::'),
inet_pton('20::'),
inet_pton('::20'),
inet_pton('9::'),
inet_pton('::9')
);
print "\nbefore sort:\n";
foreach ($a as $r) { print inet_ntop($r) . "\n"; flush(); }
sort($a);
print "\nafter sort:\n";
foreach ($a as $r) { print inet_ntop($r) . "\n"; flush(); }
Когда я запускаю это в своей среде разработки, я получаю следующий вывод, который является правильным:
PHP was compiled without --disable-ipv6 option
before sort:
::1
1::
::a
a::
20::
::20
9::
::9
after sort:
::1
::9
::a
::20
1::
9::
a::
20::
Таким образом, хорошие новости заключаются в том, что inet_pton (), inet_ntop (), sort () и ksort () будут «просто работать» так, как я хочу.
Это радует. И удивлен, в хорошем смысле, PHP!
РЕДАКТИРОВАТЬ: Там, кажется, есть ошибка в inet_pton что усложняет использование «очевидного» подхода Майкла Хэмптона. К счастью, есть способы обойти это.
Других решений пока нет …