這段代碼是否可以用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