- ベストアンサー
理想的なハッシュ関数
C++での質問です. たとえば以下のようなmyclassクラスがあり, メンバ変数のx,y,ar[10]を使って 0~ 1020 の範囲のハッシュ値を得たいのですが, どうも偏った値しか得られません. できるだけ指定範囲の中で均一に値を生成するような myclass::hush() を作るとしたらどのような計算方法が考えられるでしょうか? ちなみにx,y,ar[10]の整数型変数はいずれも 0~50程度の値です. const int modnum = 1021 ; /* 素数 */ class myclass{ private: int x; int y; int ar[10]; public: int hush(); }; int myclass::hush(){ int sum; /* ここで x, y, ar[10]を使った計算を行う */ sum = /* x, y, ar[10]から導き出した値 */ return sum % modnum; }
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
x, y, a[10]の関係性がわからないと、 はっきりしたことは言えませんが… まず、足し算・掛け算はだめですよね。 1021種類にはばらけませんから。 1021に分けるハッシュというのはけっこう大きいですね。 普通考えると、シフト演算して足すぐらいかなあ…と思います。 sizeof(int)は4と考えてよろしいですね? その場合、 ---------------------- sum = (x << 16) + (y << 8) + a[10]; ---------------------- こんなところでどうでしょう。 sizeof(int)が2なら(今時ないとは思うけど)、 ---------------------- sum = (x << 10) + (y << 5) + a[10]; ---------------------- ぐらいで。 実際どうなるかわかりませんが、ためしにやってみてください。
その他の回答 (1)
- ymmasayan
- ベストアンサー率30% (2593/8599)
オーバーフローを考えないで言うと、私なら 51*51*X+51*Y+ar[10]を使います。
お礼
アドバイスありがとうございました.
お礼
シフト演算でなんとか上手くいきそうです. アドバイスありがとうございました.