web-dev-qa-db-ja.com

Cで適切なハッシュテーブルの実装を探している

私は主に文字列キーに興味があります。誰かが私を図書館に向けることができますか?

67
SetJmp

同じニーズがあり、いくつかの調査を行った結果、 libcf

シンプルで読みやすいので、変更する必要がある場合は、理解するのにあまり時間をかけずにそれを行うことができます。また、BSDライセンスのものです。構造体を変更する必要はありません(次のポインタを埋め込むため)

次の理由で他のオプションを拒否する必要がありました(個人的な理由、YMMV):

  • sglib->それはマクロ迷路であり、マクロだけを使用してそのようなコードベースでデバッグ/変更を行うのは快適ではありませんでした
  • cbfalconer->多くのライセンスのレッドフラッグ。サイトはダウンしており、サポート/作成者に関するウェブ上での好ましくない議論が多すぎました。リスクを冒したくなかった
  • google sparce-hash->すでに述べたように、CではなくC++用です。
  • glib(gnome hash)->非常に有望に見えました。しかし、開発者キットをインストールする簡単な方法が見つかりませんでした。本格的な開発環境ではなく、Cルーチン/ファイルが必要でした
  • ジュディ->単純な使用には複雑すぎるようです。また、問題が発生した場合、自分でデバッグする準備ができていませんでした。
  • npsml(ここで言及)->ソースが見つかりません
  • strmap 非常にシンプルで便利であることがわかりました-キーと値の両方が文字列でなければならないのは単純すぎます。文字列である値は制限が強すぎるようです(void *を受け入れる必要があります)
  • thash ->良いようです(ハッシュテーブルでウィキペディアで言及されています);構造体を変更する必要があることがわかりました-パフォーマンスは実際には私の使用の懸念ではないので、それをしたくありませんでした-それは開発の速度です.

要約すると、strmapは非常に簡単に使用できます。追加のメモリ使用が懸念される場合は、uthashを使用します。開発の速度または使いやすさだけが主な目的である場合は、libcfuが優先されます[libcfuはノード/ハッシュテーブルを維持するために内部的にメモリ割り当てを行います]。利用できる単純なCハッシュ実装があまりないのは驚くべきことです。

56

GLibは、Cプロジェクトの基盤として使用できる優れたライブラリです。ハッシュテーブルなど、適切なデータ構造が用意されています。 http://developer.gnome.org/glib/2.28/glib-Hash-Tables.html (2011年4月6日更新)

16
Daniel M

文字列の場合、 Judy Array が適切な場合があります。

Judy配列は複雑ですが、整数または文字列キーを使用して値を保存および検索するための非常に高速な連想配列データ構造です。通常の配列とは異なり、Judy配列はまばらです。つまり、未割り当てのインデックスの範囲が広い場合があります。

Judy libraryin[〜#〜] c [〜#〜]

スパース動的配列を実装する最先端のコアテクノロジーを提供するCライブラリ。 Judy配列は、nullポインターで単純に宣言されます。 Judyアレイは、実装されている場合にのみメモリを消費しますが、必要に応じて利用可能なすべてのメモリを利用できるように成長できます。


その他の参照、
この Wikipediaハッシュ実装リファレンス には、いくつかのCオープンソースリンクがあります。
また、 cmph -Cの最小完全ハッシュライブラリは、アルゴリズム。

8
nik

この質問をしてから長い時間が経ちました...独自のパブリックドメインライブラリをリストに追加できるようになりました。

http://sourceforge.net/projects/npsml/

5
SetJmp

Dave Hansonの Cインターフェイスと実装 には、洗練されたハッシュテーブルと他のいくつかの適切に設計されたデータ構造が含まれています。 Nice文字列処理インターフェイスもあります。余裕があればこの本は素晴らしいですが、そうでなくても、このソフトウェアは非常にうまく設計されており、全体を学習するのに十分小さく、いくつかの異なるプロジェクトで再利用しやすいことがわかりました。

5
Norman Ramsey
5
Nick Van Brunt

Cインターフェイスと実装 Cでのハッシュテーブルの実装について説明します。ソースコードは オンラインで利用可能 です。 (本の私のコピーは仕事中ですので、私はより具体的にすることはできません。)

4
sblair

ApacheのAPRライブラリには独自の hash-implementation があります。これは、Apacheが実行されているものに既に移植されており、 Apacheライセンス もかなりリベラルです。

3
Mikhail T.
3
alex

決して使用しませんでしたが、 Google Sparsehash は動作する可能性があります

2
Nick

tcl をダウンロードして、実績のあるtclハッシュ関数を使用します。それは簡単です。 TCL APIは十分に文書化されています。

2
xcramps

Gperf-完全ハッシュ関数ジェネレーター

http://www.ibm.com/developerworks/linux/library/l-gperf.html

0
joe