flatray.com | 戻る 更新日時: 2022-01-30

IPv4 CIDR(アドレスブロック)を高速に結合する

目的

速度

ソース

ライセンス

実行例

    sort -t / -k 2 -n INPUT_FILE | perl ipaddress-merge.pl > OUTPUT_FILE

入力データについて

参考: アルゴリズム

入力される各CIDRに対して、

最後にリスト上の IPアドレスレンジを CIDR に変換・出力する。

以下は※の処理の解説。

既に登録されているアドレスブロック群(A)に対して、処理対象アドレスブロック(B)が

・同じ
    | A |
    | B |

・隣接も包含もしない
    | A |
            | B |
                    | A'    |

・隣接する
    | A |
        | B |

・包含する (処理が常に新規で、入力をアドレスブロックサイズ順に
  ソートしておくと、この状況は発生しない)
        | A |
    | B         |

・包含される
    | A         |
        | B |

・(入力が範囲じゃなくてブロック単位なので、一部重なる、は考慮しない)
    | A     |
        | B     |

Aの各要素は、始点と終点の重複がない、と想定。
また処理によりそうなるはずだし、ならないといけない。

隣接する時は、以下の3通りがある。
・始点のみ隣接する
    | A |
        | B |
・終点のみ隣接する
        | A |
    | B |
・始点と終点の両方が隣接する
    | A |   | A'    |
        | B |

包含する時だけ、A が複数存在する場合がある。
        | A |   | A'    |
    | B                 |

(以上)