我需要根据 java 对象的值变量创建唯一代码

I need to create a unique code from value variables of a java object

我考虑过:

codeUnique=Math.abs(film.hashCode()+((Integer)numero).hashCode()+
                    ((Integer)fornitura).hashCode();

但是使用 hashCode 是不行的,因为它不是唯一的,它会随着时间的推移而变化。变量是这些:

    private int numero;
    private String film;
    private int fornitura;

谢谢!

虽然哈希码不必是唯一的,但下面的代码 在实践中应该给出几乎独特的结果,当 numero 或 fornitura 不为负时, 这很可能是这种情况。 此代码不会为以下各项提供唯一结果的可能性很小 真实世界数据输入。

如果你不想依赖那个假设,那么你必须引入 您在构造对象时生成的您自己的唯一 ID。

用于创建 hascode。另请参阅:Josh Bloch:Effective Java,第二版,第 9 项

在许多情况下,您不需要唯一 ID,合适的哈希码如下所示:

public int hashCode() {
  int result = 17;
  result = 31 * result + numero;
  result = 31 * result + fornitura;
  if (film != null) {
    result = 31 * result + film.hashCode();
  }
  return result;
}

如果您需要一个实际唯一的代码,对于真实世界的数据是唯一的, 无需采用昂贵的方式创建和查找唯一代码 数据(-base),你可以试试这个: 它使用 long 而不是 int。

(记住一辈子,不需要任何保证,都是概率问题)

public long uniqueCode() {
      long result = 17;
      result = 31 * result + numero;
      result = 31 * result + Long.MAX_VALUE << 16 + fornitura;
      result = 31 * result + Long.MAX_VALUE << 32 + stringCode(film);
      return result;
  }

  public static long stringCode(String s) {
     if (s == null) return 0;
     long h = 0;
     int len = s.length();
     for (int i = 0; i < len; i++) {
          h = 31*h + s.charAt(i);
     }
     return h;
  }