多くの IT 企業では、アルゴリズムは面接で非常に重要な部分を占めていますが、実際の仕事でアルゴリズムに遭遇することはほとんどなく、あまり実用的ではないと不満を言う人も多くいます。弊社が面接でよく使う質問について解説します。最下層では非常にシンプルなアルゴリズムが使われていますが、実際の業務では比較的見やすいシナリオである、大規模なブラックリストIPマッチングについて解説します。同時に、セキュリティ ゲートウェイで開発した例を使用して検証を行います。 1. 問題とシナリオ 問題: IP セグメントのリストが膨大にあり、特定の IP がそれらのいずれかに属しているかどうかをすばやく確認する必要があります。 これは実際にはよくある問題です。当社のセキュリティ ゲートウェイを例にとると、少なくとも次のシナリオで必要になります。 シナリオ 1: 単純なブラックリストとホワイトリストのマッチング ゲートウェイの場合、ブラックリストとホワイトリストのマッチングは基本的な機能です。
シナリオ2: 実際のIPアドレスを取得する 実際の IP アドレスを取得することは、トラフィックのソース パスが異なる可能性があるため、一部の Web サイトにとっては非常に厄介な問題です。
同様の参考として、nginx の real ip 関数を参照できます。原理も比較的単純です。「set_real_ip_from 192.168.1.0/24;」のようなステートメントを通じて内部 IP リストを設定できます。このように、XFF ヘッダーを処理するときに、後ろから前に向かって検索し、再帰モードで、内部 IP ではない最初の値、つまり実際の IP を見つけます。これでこの記事の質問に戻ります。 シナリオ 3: トラフィックのラベル付け この部分の機能は、バックエンドのビジネスモジュールによって実装されることが多いです。製品を開発する際には、リクエストが来たときに何らかの自動アノテーションを行って、バックエンドの負担を軽減したいと考えています。より便利なものは次のとおりです。
上記のシナリオは、比較的簡単に遭遇する大規模な IP セグメント リストを照合するいくつかのアプリケーション シナリオについて説明しています。 2. アルゴリズムの説明 アルゴリズム 1: ハッシュマップ ほとんどの人の最初の反応は、ハッシュマップを使用して一致させることですが、これは理論的には可能です (ネットワーク セグメントを独立した IP に分割する) が、基本的には使用できません。
したがって、ハッシュマップ方式はクエリには効率的ですが、実装レベルでは実現可能ではありません。 アルゴリズム2: ネットワークセグメントリストの順次マッチング 現在、ほとんどのオープンソース実装がこの方式を採用していることがわかります。たとえば、シナリオの段落で説明した nginx の 2 つの機能モジュールは、accss モジュールと realip モジュールにあります。これらは、設定を cidr リストとして保存し、それらを 1 つずつ照合します。別の実装は、openresty の lua-resty-iputils モジュールです。このコードはより直感的に見えます。
オープンソース実装は、ほとんどの単純なシナリオを処理するのに十分ですが、その後のテストでは、IP セグメントの数が増えると、パフォーマンスがまだ不足していることが示されています。 アルゴリズム3: 二分探索 実際のアルゴリズムは非常にシンプルで、バイナリ検索を使用するだけです。これらの IP セグメントが互いに隣接していないと仮定して、図に示すように、Java に似たバイナリ検索を使用します。 隣接していない 4 つの IP セグメント A、B、C、D があるとします。各セグメントは、開始 IP の整数表現と終了 IP の整数表現の 2 つの数値に変換できます。たとえば、0.0.0.0/24 は [0, 255] に変換できます。このように、4 つのネットワーク セグメントは 8 つの数字に変換され、並べ替えることができます。ネットワーク セグメントは互いに隣接していないため、図に示すように、1 つの IP セグメントが別の IP セグメントに接続されている必要があります。このマッチングアルゴリズムはよりシンプルになります:
したがって、アルゴリズム全体は非常にシンプルですが、ネットワーク セグメントが互いに隣接していないことを前提としているため、見落とされがちです。以下は簡単な説明です。 任意の 2 つのネットワーク セグメント A と B には、次の 3 つの関係があります。
上の図は、任意の 2 つのネットワーク セグメントを示しています。
それで:
したがって、元データがある程度前処理されていれば、バイナリ検索は安全かつ効果的な方法です。 3. テストデータ 最近はかなり多くの携帯電話が発売されているので、私たちもその傾向を追ってスコアを計算してみます。
テスト1: ベンチマークテスト
テスト2: 10,000個のブラックリスト + ハッシュマップ
テスト 3: 10,000 個のブラックリスト + lua-resty-utils モジュールの順次検索
テスト4: 10,000個のブラックリスト + バイナリ検索
☞ テストデータから、バイナリ検索はハッシュベースのものに近いパフォーマンスを達成できることがわかりますが、メモリ消費ははるかに少なくなります。一方、単純な順次トラバーサルでは、パフォーマンスが桁違いに低下します。 [この記事は51CTOコラム「千安科技」のオリジナル記事です。転載についてはWeChatパブリックアカウント(bigsec)を通じて原作者にご連絡ください] この著者の他の記事を読むにはここをクリックしてください |
脳科学研究は大きな前進を遂げました!プリンストン大学の科学者らは最近、成体動物の全脳コネクトームマッ...
データの蓄積、コンピュータの計算能力の飛躍的向上、アルゴリズムの最適化により、人工知能は生活をより効...
テクノロジーは生活を変えるだけでなく、世界も変えることができます。 1760年代初頭、イギリスを中心...
2019年は確かに忙しい年でした。人工知能に関する進歩やニュースが頻繁に報道されるにつれ、私たちの...
人間が世界をどのように見ているかを理解するために、コンピューターは「目を動かす」ことを学び始めていま...
【51CTO.comオリジナル記事】 1. ロングテール効果?動物の尻尾と関係があるのでしょうか?前...
2023年10月17日(本日)、百度のシンプル検索はアップグレードを発表し、大規模モデルを通じて再構...
基礎科目として、数学はデータサイエンスと機械学習の両方において欠かせない役割を果たします。数学的な基...
朗報です、朗報です、本物のソラの新しいビデオがあります!通りかかったらぜひお見逃しなく! (本物のS...
「私は今、Miqu が Perplexity Labs の Mistral-Medium と同じモデ...
2005 年には画期的な著作「The Graph Neural Network Model」が出版さ...
今のところ、AI とブロックチェーン技術がもたらす可能性について聞いたことも、気付いていないのであれ...
最近、教育部、国家発展改革委員会、財政部は共同で「『双一流』建設大学における人工知能分野の学科統合の...
[[318810]]ビッグデータダイジェスト制作出典: rutgers.edu編纂者:張大毓如、夏亜...