一组三个字段的哈希代码

时间:2010-04-06 18:51:40

标签: java hashcode

我有三个字段,即

  1. 数字1
  2. NUMBER2
  3. 时间
  4. 我正在尝试在java中编写一个函数,该函数返回上述字段的唯一哈希值( long需要为哈希的返回类型)。然后,该哈希将用于存储与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;
        }
    }
    

2 个答案:

答案 0 :(得分:2)

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

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

(顺便说一下,成员应该用较低的字母来调用,而Time也应该是私有的。)

答案 1 :(得分:2)

您可以使用HashCodeBuilder中的commons-lang,而不必担心手动执行此操作。

@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,{{1 },Number等。)