3

タイプが AcccAA のキーがあり、A-[A...Z] (大文字)、c は [1..9] です。私は1500のセグメントを持っています。今私の一時ハッシュ関数

int HashFunc(string key){   
    int Adress = ((key[0] +  key[1] + key[2] + key[3] + key[4] + key[5]) - 339) * 14;
    return  Adress;
}

および Excel では、中央に多くの衝突が表示されます (400 から 900 まで)。

ハッシュ関数がより均等になるように教えてください。

4

2 に答える 2

3

この場合、ハッシュ関数を作成する一般的な方法は、次のような素数係数を持つ多項式を評価することです。

int address = key[0] + 
              31 * key[1] + 
              137 * key[2] + 
              1571 * key[3] + 
              11047 * key[4] + 
              77813 * key[5];
return address % kNumBuckets;

これにより、キー空間全体ではるかに大きな分散が得られます。AB000A現時点では、アナグラムが好きで衝突するため、多くの衝突が発生しますがBA000A、上記のハッシュ関数を使用すると、ハッシュは入力の小さな変化に対してはるかに敏感になります。

より複雑だが (おそらく) はるかに優れたハッシュ関数については、 shift-add-XOR hash のような文字列ハッシュ関数の使用を検討してください。これも分散は良好ですが、直感的ではありません。

お役に立てれば!

于 2013-10-27T21:37:43.203 に答える