Hashtableクラス
.NET FrameworkにはHashtablというクラスがあります。
.NET Frameworkでは組み込みのハッシュ計算式を持っていますが、独自に計算式を与えることもできます。そして、適切なハッシュ計算式を使用すれば、検索の計算量をO(1)に限りなく近づけることができるとされています。
今日、30MB位のログの中に出力されているすべての関数について、かかった処理時間を集計するというプログラムを
C#ででっちあげてみました。もちろん、処理のログなので、同じ関数が何度も出てきます。ログから検索された関数が既にリストに登録されているかどうかを調べるためにハッシュ検索はぴったりの手段です。
集計までは簡単に終わったのですが、はまったのがその集計結果を表示するところ。ListやArrayのように、IEnumeratorを実装して…と思ったら、もっと簡単にできました。IDictionaryEnumeratorが実装されているので、これをMoveNext()で手繰っていけばHashtableに登録されている一覧を取得することができます。取得順が重要な場合は自分で実装する必要があります。値がクラスでも問題ありません。
また、ハッシュをリストとして扱えるようにしようということで、Hashlistクラスが
Hashlist - Hashtable meets ArrayListで公開されています。クラスのソースファイルダウンロードには無料の登録が必要ですが、記事中だけでも充分わかるでしょう。
Visual Basic .NETでは、
MicrosoftからKBに
[HOW TO] Visual Basic .NET で HashTable コレクションを使用する方法として紹介されています。
//メンバ変数をpublicにしているけど、サンプルコードを短くするためです。
// 取得ならばプロパティで実装してください。
class ClassA {
    public string strKey;
    public string strValue1;
    public int iValue;
};
IDictionaryEnumerator myEnumerator = ClassA.GetEnumerator();
ClassA oResult;
while(myEnumerator.MoveNext()) {
    oResult = (ClassA)myEnumerator.Value;
    Console.WriteLine("{0},{1},{2}", myEnumerator.Key, oResult.strValue1, oResult.iValue);
}
また、ハッシュそのものについて興味が出た方は以下のところをどうぞ。