我有一个PHP应用程序需要按排序顺序存储IPv6地址。我已经为使用“inet”和“gmp”库函数的IPv6地址编写了一个比较操作,但我正在寻找一种更有效的方法来实现这一点 - 理想情况是直接操作IPv6地址的16字节打包字符串表示。有没有一种方便的方法(不编译自定义PHP扩展)?
编辑:我对时间和空间效率感兴趣,这就是为什么我被这个想法所吸引使用打包字符串表示。虽然我知道路由器使用基于特里的基于trie的表示来优化某些搜索操作,但我不是要求在这个问题中引用任何C库或研究论文。我特别询问PHP中的排序,这与C,Perl或Python中的排序完全不同。要管理的地址数是< 1亿,但超过100万。
答案 0 :(得分: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()将&#34;只是工作&#34;我想要的方式。
这让我很开心。并且以一种好的方式感到惊讶,PHP!
编辑:似乎有一个bug in inet_pton使迈克尔汉普顿的使用变得更加复杂,而且显而易见的是#34;做法。幸运的是,有办法解决它。