有没有一种有效的方法来对PHP中的压缩字符串进行排序

时间:2015-02-07 15:24:17

标签: php ipv6 processing-efficiency

我有一个PHP应用程序需要按排序顺序存储IPv6地址。我已经为使用“inet”和“gmp”库函数的IPv6地址编写了一个比较操作,但我正在寻找一种更有效的方法来实现这一点 - 理想情况是直接操作IPv6地址的16字节打包字符串表示。有没有一种方便的方法(不编译自定义PHP扩展)?

编辑:我对时间空间效率感兴趣,这就是为什么我被这个想法所吸引使用打包字符串表示。虽然我知道路由器使用基于特里的基于trie的表示来优化某些搜索操作,但我不是要求在这个问题中引用任何C库或研究论文。我特别询问PHP中的排序,这与C,Perl或Python中的排序完全不同。要管理的地址数是< 1亿,但超过100万。

1 个答案:

答案 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;做法。幸运的是,有办法解决它。