我有一个PHP应用程序,它需要按排序顺序存储IPv6地址。我已经为IPv6地址编写了一个比较操作,它使用了"inet“和"gmp”库函数,但我正在寻找一种更有效的方法--理想的方法是直接对IPv6地址的16字节填充字符串表示进行操作。是否有一种方便的方法(无需编译自定义PHP扩展)?
编辑:在这里,我对时间和空间效率都感兴趣,这就是为什么我被使用打包字符串表示的想法所吸引。虽然我知道路由器用于优化某些搜索操作的IPv6集有一些花哨的基于trie的表示,但我并不要求引用这个问题中的任何C库或研究论文。我专门问的是PHP中的排序,这与C、Perl或Python中的排序非常不同。要管理的地址数量是<1亿,但超过100万。
发布于 2015-02-09 03:30:18
正如迈克尔·汉普顿在评论中指出的那样,排序()和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!
编辑:看上去像是一个pton,它使迈克尔·汉普顿的“明显”方法的使用复杂化了。幸运的是,有很多方法可以解决这个问题。
https://stackoverflow.com/questions/28383876
复制相似问题