2016-08-20 6 views
-1

HashMap/HashTableの独自の実装を作成しました(これらは異なるとは限りませんが、この質問には関係ありません)。C - void型をハッシュしますか?

この実装では、非常に柔軟性がありたいと思います。私はアルゴリズムのコードを変更することなく、int、構造体、文字、文字列などをすべてキーまたは値として格納できるようにしたい。たとえば、Javaで私はちょうど行うことができます:

HashMap<Integer, MyPersonalClass>それだけで動作します。 Cでは、void*以外は直接の同等物がないことが分かります。私のHashMap/HashTable、その後、私のhash()方法は何とか正しくkeyを解析する必要を構成するノード(複数可)として

/* Node structure. */ 
struct hm_Node 
{ 
    void *key, *value; 
    struct hm_Node *next; 
}; 

:私が持っている場合は問題があります。これまでのところ、私はchar*のアルゴリズムだけを調べました。

まさにその作業を行いどのよう
// This may not be valid code, just using it as an example 

unsigned int hash(void *ptr) 
{ 
    switch(typeof(ptr)) // I know ptr is of type void* 
    { 
    case char*: ... break; 
    case char: ... break; 
    case int: ... break; 
    } 
} 

のようなものはありますか?私は、X、Y、ZタイプのHashMapに対して全く異なる実装を避けるようにしようとしています。ありがとう。

+4

Cにようこそ。魔法はありません。自分の筋肉を持ってきてください。 –

+0

'void *'(例えば '(void *)&something'で) '非表示'のタイプを抽出することはできません。 – ForceBru

+0

@KerrekSBだから....私は何をしますか?私は、複数の 'HashMaps'を持っていたいとしましょう。 1つの「キー」は「ダブル」で、もう1つは「ストリング」です。確かに私は 'HashMap.c'と' HashMap.h'を貼り付け、 'HashMapForDoubles.c'と' HashMapForDoubles.h'をコピーするつもりはありません – Hatefiend

答えて

2

たとえば、qsortの実装を見てください。ユーザーは任意の並べ替えを実装できるように、比較関数を提供できます。

関数ポインタを使用して適切なハッシュ関数を提供することで、同じ方法を使用できます。必要に応じて、再利用できる標準型のハッシュ関数をいくつか用意することができます。

+0

あなたが話しているコードは[this](http://opensource.apple.com//source/xnu/xnu-1456.1.26/bsd/kern/qsort.c)であることを確認してください。 – Hatefiend

+0

@Hatefiendうん、それは私が話していたことです - あなたの目的のために再利用するコードはあまりないかもしれませんが、間違いなく*コンセプト*です。 – tofro

+0

このソースコードのどの部分が、どういうわけか、それが機能する方法を変えるデータを供給できるようになっていますか? – Hatefiend

関連する問題