2017-06-19 1 views
1

をキャスト対Math.Abs​​私はC# Collections上のビデオを見ての途中で、現在午前私の興味をそそった次のコードビットに出くわした:絶対値を取得するために、二回

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

これはから変更されました第2の実施形態は、の元寄付それを残しながら、最初の実装は、の値とハッシュキー葉

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

:前期待通りの結果

私は手動ので、私は次のように私は私の関数を呼び出すとき、その単語を含むバケットを取得することを期待私のハッシュテーブルに「こんにちは」の文字列を追加しました:ここ

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にキャストを意味します。これを行うと、負の結果が2番目のhashKeyに送られます。 したがって、以下hashKeyは同一である:

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

Iは括弧なしで、それは最初uint%のない結果)にhashcodeをキャストすることを言及しているshouleとhashCodeが負の場合、その符号なしになります別の番号は必ずhashCodeと同じではありません。

関連する問題