有没有一种有效的方法来对 PHP 中的压缩字符串进行排序?
Is there an efficient way to sort packed strings in PHP?
我有一个 PHP 应用程序需要按排序顺序存储 IPv6 地址。我已经为使用 "inet" 和 "gmp" 库函数的 IPv6 地址编写了一个比较操作,但我正在寻找一种更有效的方法来执行此操作 - 理想情况下直接对 16 字节打包字符串表示进行操作的 IPv6 地址。有没有方便的方法(无需编译自定义 PHP 扩展)?
编辑: 我对 time 和 space 都感兴趣效率,在这里,这就是为什么我被使用打包字符串表示的想法所吸引。尽管我知道路由器使用基于 trie 的奇特 IPv6 集表示来优化某些搜索操作,但我并没有要求在这个问题中引用任何 C 库或研究论文。我特别询问 PHP 中的排序,这与 C、Perl 或 Python 中的排序完全不同。待管理地址数量<1亿,但超过100万。
正如 Michael Hampton 在评论中指出的那样,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() 将 "just work" 按照我希望的方式进行。
这让我很开心。 PHP!
编辑: 似乎有一个 使 Michael Hampton 的 "obvious" 方法的使用变得复杂。幸运的是,有一些方法可以解决它。
我有一个 PHP 应用程序需要按排序顺序存储 IPv6 地址。我已经为使用 "inet" 和 "gmp" 库函数的 IPv6 地址编写了一个比较操作,但我正在寻找一种更有效的方法来执行此操作 - 理想情况下直接对 16 字节打包字符串表示进行操作的 IPv6 地址。有没有方便的方法(无需编译自定义 PHP 扩展)?
编辑: 我对 time 和 space 都感兴趣效率,在这里,这就是为什么我被使用打包字符串表示的想法所吸引。尽管我知道路由器使用基于 trie 的奇特 IPv6 集表示来优化某些搜索操作,但我并没有要求在这个问题中引用任何 C 库或研究论文。我特别询问 PHP 中的排序,这与 C、Perl 或 Python 中的排序完全不同。待管理地址数量<1亿,但超过100万。
正如 Michael Hampton 在评论中指出的那样,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() 将 "just work" 按照我希望的方式进行。
这让我很开心。 PHP!
编辑: 似乎有一个