我有三个字段,即
我正在尝试在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;
}
}
答案 0 :(得分:2)
我认为它是hashCode的特殊版本。否则,您需要覆盖hashCode
,不要定义新方法。像HashSet
这样的容器没有自己的哈希码。
long
的专用版本,您不需要使用xor(^),因为它已经很长了。只需使用long
值。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中,变量名以小写字母开头是惯例。您会发现将变量命名为Number1
,Number2
等等会让人感到困惑,因为人们会将这些变量与类型名称混淆(例如String
,{{1 },Number
等。)