2

サーバーID、ストリームID、メッセージIDの3つの整数を持つクラスがあります。

小さいものHashSetもありますが、交差点を設定するなど、多くのことを行います。また、に10K以上の要素があるものもあります。

serverIDの値はほんの一握りですが、それらは完全に32ビットのランダム性を備えた真の乱数です。多くの場合、ハッシュテーブル全体に対してserverIDは1つだけです。それ以外の場合は、2つのserverIDだけです。

streamIDは少数で、通常は0ですが、1または2の場合もあります。

messageIDは、serverID/streamIDのペアごとに順次増加します。

私は現在持っています:

(-messageID << 24) ^ messageID ^ serverID ^ streamID

順次増加するmessageIDがあり、他の多くのビットを混在させていないにもかかわらず、優れたハッシュ関数があることを理解したいと思います。

何が良いhashCodeのか、そしてどうすればこれら3つの数字を最もよく組み合わせることができますか?

4

2 に答える 2

1

Eclipseはそれに自己良いハッシュコード生成を与えます

@Override
public int hashCode() {
    final int prime = 31;
    int result = 1;
    result = prime * result + messageID;
    result = prime * result + serverID;
    result = prime * result + streamID;
    return result;
}
于 2012-08-20T09:05:44.167 に答える
1

私は個人的に常に以下で実装された戦略を使用しますjava.lang.String

        for (int i = 0; i < len; i++) {
            h = 31*h + val[off++];
        }

したがって、あなたの場合、私は以下を使用します:31 * (31 * messageID + serverID) + streamID

于 2012-08-20T09:06:39.257 に答える