2011-02-10 8 views
0

hash.hをコード内でどのように使用できますか?私はダブルを取り、ポインタを吐き出す高速のハッシュテーブルをコーディングしたい。それを使用することは可能ですか?私はそれにハッシュに関連する通常のルーチンを見ません。Linux hash.h:高速ハッシュルーチンの使用

soham

+0

これは 'hash.h'ですか? http://tomoyo.sourceforge.jp/cgi-bin/lxr/source/include/linux/hash.h – kennytm

+0

うん......右 – Soham

答えて

2

マップベースのデータ構造は内部的にハッシュ関数を使用しています。 hash.hは後者のみを提供しますが、データ構造を与えるライブラリがあります。ポインタにダブルをマッピングするために(すべての主要なLinuxディストリビューションで利用可能です)libHXを使用した例では、特定のハッシュ関数を使用して、(エラー処理を簡潔にするために省略):

#include <stdio.h> 
#include <libHX/map.h> 

static unsigned long linux_hash(const void *p, size_t chars) 
{ 
     // replace return 0 by algorithm from hash.h 
     return 0; 
} 

static const struct HXmap_ops ops = { 
     .k_hash = linux_hash, 
}; 

int main(void) 
{ 
     struct HXmap *map; 
     double i; 

     map = HXmap_init5(HXMAPT_DEFAULT, HXMAP_CKEY, &ops, sizeof(double), 0); 
     i = 3.141; 
     HXmap_add(map, &i, main); 
     i = 3.141/2; 
     HXmap_add(map, &i, map); 

     i = 3.141; 
     printf("3.141 maps to %p\n", HXmap_get(map, &i)); 
     i = 3.141/2; 
     printf("pi/2 maps to %p\n", HXmap_get(map, &i)); 
     return 0; 
} 

何k_hashがjenkins3、指定しなかった場合には合理的なデフォルトとして使用されます。 Linuxのhash.hのハッシュ関数は非常に少なく、良いプロパティとして提供されない可能性があります。

+0

Suuuweeeeeettt ....どのようなコードの素晴らしい作品。今質問の要点。 HXmapの詳細はどこで読むことができますか? – Soham

+0

ここでは、Ubuntu10.10にisLibHXがインストールされています。sourceforgeのLibHXのDistroマップにはありますが、見つけられません。 – Soham

+0

libhx-dev> = 3.0は、Ubuntu独自のリポジトリで提供されています(ちょっとだけ入手してください)。他のライブラリ(archに応じて/ usr/lib64または/ usr/lib)と同じ場所にインストールされます。さらに、pkg-configも使用しているため、実際に使用するプロセスはかなり標準化されています。 – user611775

0

ハッシュは数値を吐き出します。ポインタを吐き出さないでしょう。

この番号は、アイテムのインデックスを配列(または同様の構造)に格納して検索するために使用できますが、アイテムの実際のメモリアドレスとは関係ありません。

これが役に立ちます。

+0

エドウィンは、他のデータ構造でも、 。私は(理想的に)他のデータ構造(構造体)を見つけるためのO(1)検索をしたいと思っています – Soham

+0

彼はポインターに二重をマッピングするハッシュ*テーブル*について話しています。ハッシュ関数*。 –

+0

@Soham、O(1)検索が必要な場合は、Hashtableが必要です。ハッシュ関数は、ポインタ/オブジェクト参照を格納するテーブルのインデックスを吐き出します。 @Jimありがとう、両方の問題をどのように見ているのかを詳しく説明してくれてありがとうございます。 –

関連する問題