そのため、私の暗号化ライブラリには、頻繁に使用するベース コンバーターがあります。これは世界で最も効率的な方法ではありませんが、すべての範囲の入力に対して非常にうまく機能します。
作業の大部分は、コールバック ループによって行われます。
$callback = function($source, $src, $dst) {
$div = array();
$remainder = 0;
foreach ($source as $n) {
$e = floor(($n + $remainder * $src) / $dst);
$remainder = ($n + $remainder * $src) % $dst;
if ($div || $e) {
$div[] = $e;
}
}
return array(
$div,
$remainder
);
};
while ($source) {
list ($source, $remainder) = $callback($source, $srcBase, $dstBase);
$result[] = $remainder;
}
基本的に、これは の数値の配列を受け取り、$srcBase
それらを の数値の配列に変換します$dstBase
。したがって、入力例は、結果としてarray(1, 1), 2, 10
得られるものになります。array(3)
もう 1 つの例は、次のようarray(1, 0, 0), 256, 10
になりますarray(1, 6, 7, 7, 7, 2, 1, 6)
(配列の各要素は、$dstBase
.
私が今直面している問題は、2kb のデータをフィードすると、実行に約 10 秒かかることです。だから私はそれを最適化することに着手しました。これまでのところ、構造全体を次の再帰ループに置き換えることで、約 4 秒に短縮できました。
while ($source) {
$div = array();
$remainder = 0;
foreach ($source as $n) {
$dividend = $n + $remainder * $srcBase;
$res = (int) ($dividend / $dstBase);
$remainder = $dividend % $dstBase;
if ($div || $res) {
$div[] = $res;
}
}
$result[] = $remainder;
$source = $div;
}
私が直面している問題は、それをさらに最適化する方法です (それが可能であれば)。問題は、大きな入力にかかる反復回数のせん断だと思います (2000 要素の配列の場合、基数 256 から基数 10 まで、合計で 4,815,076 回の反復が必要です)。
何かご意見は?