这段代码是否可以用hashCode作为一个简单的增量,以负数开始?将散列码作为简单增量可以吗?
private volatile static AtomicInteger creations = new AtomicInteger(Integer.MIN_VALUE);
private final int creation;
{
creation = creations.getAndIncrement();
}
@Override
public int hashCode() {
return creation;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
if (creation == ((Stuff) obj).creation)
return true;
else
return false;
}
哈希码通常是用素数编码而不是简单增量? (之所以我希望它是这样的,是因为我用这个类创建的每个对象都是唯一的,我希望能够稍后将它从HashMap中移除,即使对象的状态将改变,因为它是我的理解哈希是否发生变化,然后在添加哈希映射后无法将其从哈希映射中移除)为了防止这种情况成为简单的是或否,请向我解释执行哈希的优点和缺点。
“哈希码通常是用素数编码的,而不是用简单的增量?首先,我不认为哈希码通常是素数;散列**表**通常具有素数作为大小,但这是完全不同的事情。其次,使用一个简单的增量在你的情况下工作,因为你只有一个字段,并且该字段恰好是增量。但这是一个非常不寻常的情况。在大多数现实生活中,使用递增的值作为哈希代码是一个很大的失败,除非没有两个不同的对象是相等的,然后增量是毫无意义的。 – ajb 2015-03-31 06:52:09
@ajb我之所以不希望两个对象具有相同的散列,以及为什么我希望以这种方式计算散列,是因为在HashMap中,如果哈希已更改,我无法删除它。所以基本上,这使得我无法为基于状态的哈希创建我的对象,这些对象是不断变化的状态。 – CodeCamper 2015-03-31 06:55:55
好的,那就是_your_用例。但是如果你问为什么散列码通常不是使用一个简单的增量来计算的,那是因为你的用例不是典型的。而这种方法在元素放入哈希表的典型情况下不起作用。 – ajb 2015-03-31 07:01:26