2017-06-11 7 views
-1

Hashtableは、テーブルの各エントリでリンクリストを使用します。 Hashcodeアルゴリズムはインデックスを生成します。ハッシュコードアルゴリズムへの入力は、キーと値のペアからのキーです。ハッシュコードアルゴリズムは、char *入力を受け取り、整数インデックスを出力します。 Hashtable Get/Setメソッドは、void *とデータのサイズを使用して任意の型の入力を取得できます。ほとんど一意のインデックスを生成するためには、入力文字列は一意でなければならないが、Set/Get関数は互いに対応する必要があるので、キーがSet関数で "foobar"であれば、後で "foobar"同じハッシュテーブルインデックスに追加します。CハッシュテーブルSet/Get void *一意のメモリアドレス

問題は入力がvoid *であり、インデックスを生成するために一意の文字列が必要なことです。私が考えることができるのは、リンクリストのノードのキーの一意のメモリアドレスの文字列表現ですそのハッシュテーブルのインデックスに格納されます。

設定機能(一部のコード例)

struct Node* node_to_set = Node_Create(entry->key, entry->data, entry->keysize, entry->datasize); 
void* key = Node_Get_Key(node_to_set); 
char string_key[256] = {'\0'}; 
int bytes = sprintf(string_key, "%p", key); 
int index = Hashtable_HashCode(hashtable->size, string_key); 

get関数

//do not know what the memory address is because its in the table 
//searching for it would defeat the purpose of a constant time lookup 

がvoid *使用してこれを行うには、他の方法がある(そのユニークな文字列は、外部発信者に失われましたか)?

+2

私はこれを少なくとも3回読んで、問題点*が分からないと認めなければなりません。コリジョンチェーンのリンクリストを持つハッシュテーブルを使用しているようです。与えられたキーのハッシュインデックスを取得したら、エントリが存在するかどうかを見つけるために衝突チェーンを歩き、アクション(set/get)に応じてそれぞれadd、update、またはfetchを実行する必要があります。同値テスト*はキーアルゴリズムの一部でなければなりません。それにもかかわらず、本当にあなたの質問に従わないでください。 – WhozCraig

+1

さまざまなハッシュテーブルの実装があり、サンプルコードは複数のハッシュテーブルに対応しています。一般に、リンクされたリストは、インデックスに衝突がある場合にのみ出現する。次に、インデックスのキーがリスト内の最初のノードに置き換えられ、そのバケットの衝突が解決されます。今あなたの一般的な質問は、一意のメモリアドレスを*終わらせる*独立したものです。固有の場所にキーが格納されている場合、アドレスの16進表現には、文字列内の文字として表すことができる文字のみが含まれます。だから私はあなたがなぜ試してみることができないのか分からない。 –

+0

@WhozCraigいいえ、あまりにも遅くはなく、あなただけではなく、私はそれをもう一度読んで同じ結論に達しました。 ':)' –

答えて

0

ハッシュ関数に渡すメモリアドレスの文字列表現を使用する代わりに。私はキーのためにユニークなデリファレンスされた値を使用しました。 void *をunsigned char *にキャストしてデリファレンスし、それをハッシュ関数に渡しました。

int index = Hashtable_HashCode(hashtable->size, (unsigned char*)entry->key); 

unsigned long Hashtable_HashCode(unsigned int size, unsigned char *str) { 
     if(str != NULL) { 
       unsigned long hash = 5381; 
       unsigned int c = 0; 
       while(c = *str++) { 
         hash = ((hash << 5) + hash) + c; 
       } 
       hash = hash % size; 
       hash = (hash < 0) ? hash * -1 : hash; 
       return hash; 
     } 
     return -1; 
} 
関連する問題