ipv6 — Есть ли эффективный способ сортировки упакованных строк в PHP?

У меня есть приложение PHP, которое должно хранить адреса IPv6 в отсортированном порядке. Я написал операцию сравнения для адресов IPv6, которая использует библиотечные функции «inet» и «gmp», но я ищу более эффективный способ сделать это — в идеале, работая напрямую с 16-байтовым упакованным строковым представлением адреса IPv6 , Есть ли удобный способ сделать это (без компиляции собственного расширения PHP)?

РЕДАКТИРОВАТЬ: Я заинтересован в обоих время а также пространство эффективность, вот почему меня привлекает идея использования упакованного строкового представления. И хотя я знаю, что существуют причудливые основанные на триях представления наборов IPv6, используемые маршрутизаторами для оптимизации определенных операций поиска, я не прошу ссылки на какие-либо библиотеки C или исследовательские работы по этому вопросу. Я спрашиваю конкретно о сортировке в PHP, которая сильно отличается от сортировки в C, Perl или Python. Номер адреса для управления < 100 миллионов, но более 1 миллиона.

0

Решение

Как отметил Майкл Хэмптон в комментариях, 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 что усложняет использование «очевидного» подхода Майкла Хэмптона. К счастью, есть способы обойти это.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]