2011-07-14 9 views
0

分散キャッシュ内のn個のノードに均等にデータを分割する必要があります。ハッシュ関数によるデータの分割

次のコードは、キャッシュキーを取得し、ノードを使用するかを決定します:

public static int GetNodeIDByCacheKey(string key) 
{ 
    return Math.Abs(key.GetHashCode()) % TotalNumberOfNodes(); 
} 

残念ながらコードが異なるマシン・インスタンス間で信頼できるものではありません。 テストでは、同じキーの別のノードが返されることがあります。

何か改善のための考えやアイデアはありますか?

+0

したがって、あなたは 'key'のビット単位で同じ値に対して、異なる関数結果を得ると主張していますか? –

+0

それは私が現在疑問に思っているのは、私は –

+1

の可能な複製[GetHashCode()が別のサーバで異なる結果を出すという問題ですか?](http://stackoverflow.com/questions/6114772/gethashcode-gives-異なるサーバー上の異なる結果) –

答えて

3

stringGetHashCode()の実装に頼るべきではありません。等しい値の文字列が同じハッシュコードを生成する以外、ハッシュコードの特定の値は次のように一貫していなければなりませんアプリケーションの現在の実行のためのdocumentationごとに - - アプリケーションが再び実行される場合、異なるハッシュコードが返される可能性があります。また

あなたが問題のマシン上で異なる.NETのCLRのバージョンを持っている場合GetHashCodemight be differentの実装:

GetHashCodeメソッドの動作は共通の一つのバージョンから変更されることがあります その実装に依存しています言語ランタイムは になります。これが発生する理由は、GetHashCodeのパフォーマンスを向上させることです。あなたは自分のノードが常に再起動し、マシンの境界を越えて、このつまりは、バイト配列に文字列を変換することによって達成することができたビンにあなたをできるようになる数値にあなたの文字列キーからの一貫したマッピングを定義することができます代わりに

(つまり、Encoding.UTF8.GetBytes()を使用して)バイト配列を数値に変換する(64ビットのみを使用する損失のある変換を使用するか、BigIntegerを使用する)

+0

私はこれを読んでいますが、私はこの問題をAzure Development Environment (同じweb.roleの2つのインスタンス) –

+0

@Andrew:文字列キーの数値へのマッピングを自分で定義するのは難しくありません。常に衝突がありますが、同じ文字列値は常に同じビンにマップされます – BrokenGlass

2

特定のインスタンス(インスタンス化された文字列) (マシンAとマシンBのように)同じ文字列(たとえば "Hello")の場合、異なるhashCodeを持つ可能性があります。マシンとインスタンスの間で同じ操作が必要な場合は、文字列の内容だけを使用する独自のハッシュ関数を実装する必要があると思います。