0

つまり、3つのフィールドがあります

  1. ナンバー1
  2. 2番
  3. 時間

上記のフィールドに対して一意のハッシュ値 ( long は hash の戻り値の型である必要があります)を返す関数を Java で記述しようとしています。このハッシュは、上記のフィールドに対応するデータベース行を HashSet に格納するために使用されます。ハッシュコード関数を書くのは初めてです。誰かが私が持っているものを確認してください。

public class HashCode {

    private long Number1;
    private long Number2;
    String Time;

    public HashCode(long Number1, long Number2, String Time){
        this.Number1 = Number1;
        this.Number2 = Number2;
        this.Time = Time;
    }

    public long getHashCode() {
        long hash = 3;
        hash = 47 * hash + (long) (this.Number1 ^ (this.Number1 >>> 32));
        hash = 47 * hash + (long) (this.Number2 ^ (this.Number2 >>> 32));
        hash = 47 * hash + (this.Time != null ? this.Time.hashCode() : 0);
        return hash;
    }
}
4

2 に答える 2

3

commons-lang のHashCodeBuilderを使用するだけで、これを手動で行うことを心配する必要がなくなります。

@Override
public int hashCode() {
 // you pick a hard-coded, randomly chosen, non-zero, odd number
 // ideally different for each class
 return new HashCodeBuilder(17, 37).
   append(Number1).
   append(Number2).
   append(Time).
   toHashCode();
}

ところで、変数名を小文字で始めるのはJavaの慣例です。変数に 、 などの名前を付けるのは混乱を招くでしょう。人々はこれらを型の名前 ( Number1、、など) と混同するからです。Number2StringNumberLong

于 2010-04-06T18:59:17.097 に答える
2

hashCode の特別なバージョンだと思います。hashCodeそれ以外の場合は、新しいメソッドを定義しないで、上書きする必要があります。のようなコンテナHashSetは、独自のハッシュ コードを取得しません。

  • したがって、専用バージョンのlongでは、既に長いため、xor (^) を使用する必要はありません。long値を使用するだけです。
  • String の hashCode を使用する場合、long ではなく int のみであるため、すべてのスペースを「使用」することはありません。hashCode目的に応じて、 String をlongs で複製できます。
  • それ以外は良さそうです。

(ちなみにメンバーは小文字で呼び、Time非公開でも構いません。)

于 2010-04-06T18:54:56.683 に答える