2017-06-19 57 views
1

我目前在觀看C# Collections視頻的中間,橫跨下面的代碼位是引起了我的興趣是:Math.Abs​​與鑄造兩次檢索絕對值

int hashKey = (int)((uint)hashCode % capacity); 

這是從改變以前:

int hashKey = Math.Abs(hashCode % capacity); 

第一個實現葉hashKey與的值,而第二個執行它留在,前者給予我預期的結果。

我手動添加字符串「Hello」到我的哈希表,所以我希望取回桶含有這個詞時,我打電話給我的功能如下:

LinkedString results = hash.GetAllAtHash("Hello".GetHashCode()); 

下面是完整的功能:

public LinkedString GetAllAtHash(int hashCode) 
{ 
    int hashKey = (int)((uint)hashCode % capacity); 
    //int hashKey = Math.Abs(hashCode % capacity); 
    return values[hashKey]; 
} 

使用其中一種方式有什麼意義嗎?爲什麼他們都返回不同的值,如果我沒有看過視頻,我怎麼能在沒有編譯/運行時錯誤的情況下知道錯誤?

感謝

+0

改變了你的標題,因爲乍一看,我認爲這個問題涉及到/從'double'數據類型。 – spender

+0

我們需要的是可重複計算在桶之間公平分配。這個問題中缺少重要的部分......這個計算應該適用於存儲和檢索。 – spender

回答

0

這是所有因爲uint鑄造的。如果你寫類似下面的代碼,你將在獲得相同的結果的方式:

int hashKey = (int)((uint)(hashCode % capacity)); 

我的意思只是把hashCode % capacity在括號內,然後投射到uint。如果你這樣做,你會得到第二個hashKey負數的結果。 因此,以下hashKey可相同:

int hashKey1 = hashCode < 0 ? -(int)((uint)(hashCode % capacity)) : (int)((uint)hashCode % capacity); 
int hashKey2 = Math.Abs(hashCode % capacity); 

我shoule已經提到,如果沒有括號時,它首先施放hashcodeuint(的%沒有結果),並且如果hashCode是負的,其無符號將是另一個號碼與hashCode不一樣。