我需要根据 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;
}
我考虑过:
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;
}