我记得eclipse和idea有这个模板根据其属性自动创建一个对象的hashCode。
如果使用数字和字符串,其中一种策略是这样的。
return stringValue.hashCode() + intValue * 32;
这样的东西。
我手头没有也没有日食或想法,我想创造这样的功能。
编辑
根据答案,我创建了这个迷你课程
class StringInt {
private final String s;
private final int i;
static StringInt valueOf( String string , int value ) {
return new StringInt( string, value );
}
private StringInt( String string, int value ) {
this.s = string;
this.i = value;
}
public boolean equals( Object o ) {
if( o != null && o instanceof StringInt ){
StringInt other = ( StringInt ) o;
return this.s == other.s && this.i == other.i;
}
return false;
}
public int hashCode() {
return s != null ? s.hashCode() * 37 + i : i;
}
}
这个类将用作大内存映射的键(> 10k元素)我不想每次迭代它们以查找String和int是否相同。
谢谢。
ps .. mmh可能它应该是StringIntKey的名字。
或者,如果您不想添加其他库,请执行以下操作:
public int hashCode() {
StringBuilder builder = new StringBuilder();
builder.append(myString);
builder.append(myInteger);
return builder.toString().hashCode();
}
Eclipse总是执行大致相同的散列函数,这是一个带有in和String as字段的类的示例
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + this.interger;
result = prime * result + ((this.string == null) ? 0 : this.string.hashCode());
return result;
}
它们总是选择31作为素数,然后通过构建哈希函数或者如果它是原语的值来选择多个。像这样的东西并不难创造出一种方法。
public int hashCode(Object ... things) {
final int prime = 31;
int result = 1;
for(Object thing : things) {
result = prime * result + thing.hashCode();
}
return result;
}
哈希码方法可能被多次调用,因此值得优化。如果计算很复杂,请考虑记住哈希值。此外,避免做一些需要更多计算的事情。 (例如,StringBuilder解决方案花费大部分时间创建临时String。)
我要指出的另一件事是哈希的质量很重要。您希望避免使用映射许多公共密钥的任何哈希码算法。如果发生这种情况,哈希表查找可能不再是O(1)。 (在最坏的情况下,它将是O(N)...即等效于线性搜索!)。这是一个糟糕的哈希函数的例子:
int hashcode() {
int hash = 1;
for (int val : this.values) {
hash = hash * value;
}
return hash;
}
考虑如果一个元素会发生什么 this.values
是零......
除了最近的编辑,如果检索速度比存储问题更重要,您可以在构建时预先计算并存储哈希码 StringInt
类。这是安全的,因为你已经标记了 String
和 int
作为 final
,并且也给了它 String
是不可改变的。
此外,你可以优化你的 equals
方法通过检查被比较的对象== this
在进行全面比较之前。我还建议在比较字符串字段之前先进行更便宜的基于int的比较。
另一个最终建议:你可以改变你的 valueOf(String, int)
构造一个的方法 StringInt
或返回先前创建的实例(如果已存在的实例) String
和int值。这使得建筑更加昂贵,但比较非常便宜,因为你可以比较 StringInt
在没有两个知识的情况下使用“==” StringInt
s将永远与之相同 String
和 int
值。
你也可以使用 Objects
来自 java.util.Objects
包快速获取哈希码。
@Override
public int hashCode() {
return Objects.hash(this.string, this.integerValue, this.otherDataTypes);
}