2017-03-08 7 views
1

とハッシュ構造体Iが構造を持っている:C - unsigned int型のプロパティのN量

struct A 
{ 
    unsigned int a, b, c, d, ...  
} 

私は、関数を作りたい:

unsigned int A_hash(const A* const var) 
{ 

    return ... 
} 

数は、として非常に非常に大きくする必要があるが返さA_hash(var) < myHashTable.capacityの場合、HashTable挿入のモジュラスは正しく機能しません。

私はn整数についてなど「5つの整数で取るハッシュ関数」、「ハッシュ二つの整数を取り込み機能」、が、何のような前にこのような質問を見てきましたか?私はより一般的なアルゴリズムまともなハッシュを探しています。エンタープライズレベルである必要はありません。

私は多分

return (0x7FFFFFFFF & a) + (0x7FFFFFFFF & b) + ...

のような大規模な数字で始めることを考えていたが、私は、これは十分に良いだろうとは思いません。また、A_hash関数がオーバーフローするのを止める方法もわかりませんが、それは別の問題である可能性があります。

+1

structを連続した配列として扱います。 Adler-32などのローリングチェックサムを使用していました – bruceg

答えて

1

@brucegが説明したように、長いバイトストリームのようにオブジェクト全体をどのように扱うことができるかを暗黙のうちに尋ねていると思います。もし私が間違っていれば、あなたはこの答えを無視するかもしれません、これは私が対処するものなのでです。このソリューションは、単にハッシングには当てはまりませんが、バイトのようなデータ(メモリやファイルからのコピー/書き込みなど)を必要とするものであれば、注意してください。

あなたが探しているのは、単にバイトごとに読むことだと思います。このためには、std::ostream::write(これはC++メソッドです)から自分自身を埋め込むことができます。たとえば、あなたはこのようにそれを呼び出すことができますようにA_hashを書くことができます:

int hash = A_hash((char*)&a, sizeof(a)); // where 'a' is of type 'struct A'. 

あなたはこのように、例えば、A_hashを書くことができ:

unsigned int A_hash(char* data, unsigned int dataSize) 
{ 
    unsigned int hash = someValue; 

    for (unsigned int i = 0; i < dataSize; ++i) 
    { 
     char byte = data[i]; 
     doSomethingWith(hash); 
    } 

    return hash; 

} 

この方法の大きな利点構造体にフィールドを追加/削除する場合、関数を書き直す必要はありません。 sizeof(A)はコンパイル時に展開/縮小されます。他の大きな利点は、任意の値に対応するため、int、別のstructenum、ポインタなど、任意のタイプの関数を再利用できます。

関連する問題