Java 一组三个字段的哈希代码

Java 一组三个字段的哈希代码,java,hashcode,Java,Hashcode,我有三个字段,即 第一 2号 时间 我试图用java编写一个函数,为上述字段返回一个唯一的哈希值(long需要是哈希的返回类型)。然后,该散列将用于在散列集中存储与上述字段对应的数据库行。我刚开始写散列码函数,有人能看看我有什么吗 public class HashCode { private long Number1; private long Number2; String Time; public HashCode(long Number1, long

我有三个字段,即

  • 第一
  • 2号
  • 时间
  • 我试图用java编写一个函数,为上述字段返回一个唯一的哈希值(long需要是哈希的返回类型)。然后,该散列将用于在散列集中存储与上述字段对应的数据库行。我刚开始写散列码函数,有人能看看我有什么吗

    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;
        }
    }
    

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

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

    (顺便说一句,成员应该用小写字母称呼,时间也应该是私有的。)

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

    • 因此,对于
      long
      的专用版本,不需要使用xor(^),因为它已经很长了。只需使用
      long
      值即可
    • 当使用字符串的hashCode时,它不是很长,只是int,所以它不会“使用”所有的空间。您可以使用
      long
      s复制字符串的
      hashCode
      ,以满足您的需要
    • 其他的看起来不错
    (顺便说一句,成员应该用小写字母称呼,时间也应该是私人的。)

    你可以直接使用from,不用再担心手工操作了

    @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
    Number
    Long
    ,等等)。

    你可以直接使用from,不用再担心手工操作了

    @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
    Number
    Long
    ,等等)