1

DNSルックアップ(IP->ホスト名)を高速化するためにローカルキャッシュを実装しています。キャッシュは、CSV ファイル ("1.1.1.1host.example.com") から次の 2 つのフィールドを持つ TStringList にロードされます。

TStringList[0] := IPAddress;
TStringList[1] := HostName;

IP 経由で TStringList にクエリを実行するので、最初のフィールドをソートする必要があります。

TStringList.sorted := True;

より速く見つけることができるようにそれを処理しますか

IPResolved:=TStringList[TStringList.IndexOf('1.1.1.1'),1];

?

ありがとう!

4

1 に答える 1

12

免責事項:

これでは、文字列リストを並べ替える方法や、データを文字列リストに読み込む方法については答えられません。目的に応じて文字列リストを使用するよりも効率的なハッシュテーブルを使用することができます(40kの名前、名前による検索との値のペア)。

別:

Delphi XE2を使用しているため、ジェネリックTDictionaryクラスを使用できます。キーとしてIPアドレス、値としてホスト名が含まれます。次のコードは、辞書に入力する方法と、指定されたキー(IPアドレス)で値(ホスト名)を検索する方法を示しています。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Generics.Collections;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    IPList: TDictionary<string, string>;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  // create the TDictionary instance
  IPList := TDictionary<string, string>.Create;
  // here you will read your CSV file and add the items in a loop
  // I've used here some of the major IP addresses for Sweden
  IPList.Add('77.244.224.0', 'Insat Net AB');
  IPList.Add('79.138.128.0', 'Hi3G Access AB');
  IPList.Add('62.181.192.0', 'DGC Access AB');
  IPList.Add('81.216.128.0', 'TDC Swerige AB');
  IPList.Add('80.252.176.0', 'Phonera Networks AB');
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  // release a dictionary instance
  IPList.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  HostName: string;
begin
  // and how to search by the IP address and get the host name if found
  if IPList.TryGetValue('81.216.128.0', HostName) then
    ShowMessage(HostName)
  else
    ShowMessage('IP address not found!');
end;

end.

拡大:

上記のソリューションでは、構造を使用してホスト名だけでなく、たとえばホストの場所も格納するように簡単に拡張できます。

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Generics.Collections;

type
  TIPData = record
    HostName: string;
    HostLocation: string;
  end;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
  private
    IPList: TDictionary<string, TIPData>;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  IPData: TIPData;
begin
  IPList := TDictionary<string, TIPData>.Create;

  IPData.HostName := 'Broadnet Europe France';
  IPData.HostLocation := 'France';
  IPList.Add('78.155.128.0', IPData);

  IPData.HostName := 'DNA Palvelut Oy';
  IPData.HostLocation := 'Finland';
  IPList.Add('62.113.160.0', IPData);

  IPData.HostName := 'CD-Telematika a.s.';
  IPData.HostLocation := 'Czech republic';
  IPList.Add('89.203.128.0', IPData);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
  IPList.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  IPData: TIPData;
begin
  if IPList.TryGetValue('89.203.128.0', IPData) then
    ShowMessage('Provider ' + IPData.HostName + ' from ' + IPData.HostLocation)
  else
    ShowMessage('IP address not found!');
end;

end.
于 2012-08-14T15:26:37.730 に答える