0

我有三个领域,即

  1. 1号
  2. 2号
  3. 时间

我正在尝试在 java 中编写一个函数,该函数为上述字段返回一个唯一的哈希值( long 需要是 hash 的返回类型)。然后,此哈希将用于存储与 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 中的约定是变量名以小写字母开头。您会发现将变量命名为 , 等会让人感到困惑Number1Number2因为人们会将它们与类型的名称(例如String, Number,Long等)混淆。

于 2010-04-06T18:59:17.097 回答
2

我认为它是 hashCode 的特殊版本。否则你需要覆盖hashCode,不要定义新方法。像这样的容器HashSet没有自己的哈希码。

  • 因此,对于您的专用版本long,您不需要使用 xor (^),因为它已经很长了。只需long使用价值。
  • 当使用 String 的 hashCode 时,它​​不会持续很长时间,只是用于 int,所以它不会“使用”你所有的空间。为了您的目的,您可以使用 s复制hashCodeString 。long
  • 其他看起来不错。

(顺便说一下,成员应该用小写字母称呼,并且Time也应该是私人的。)

于 2010-04-06T18:54:56.683 回答