4

文字列を特定の数のバケットにハッシュするアルゴリズムを考え出そうとしていますが、これを行う方法についてアイデアを思いつくことができませんでしたか?

次のような文字列のリストがあります。

a.jpg
b.htm
c.gif
d.jpg
e.swf

文字列に基づいて1から4までの数値を取得する関数を実行したいと思います。

egajpg は 3
b.htm は 2
c.gif は 1
など

一貫性が必要なので、a.jpg で関数を実行すると、常に 3 が返されます。

このアルゴリズムは、サーバー間でリソースを分割するためのものです...

egajpg は server3.mydomain.com からアクセスされ、b.htm は
server2.mydomain.com からアクセスされます。

私がこれを行う方法を知っている人はいますか?

どんなアドバイスでも大歓迎です!

乾杯

ティム

4

4 に答える 4

4

次のブログ投稿が役立つ場合があります。提案されたアルゴリズムは次のとおりです。

int bucketIndex = (int)((uint)"d.jpg".GetHashCode() % (uint)buckets.Length);
于 2011-03-23T23:09:09.637 に答える
1
int bucket = (int)(unchecked(((uint)s.GetHashCode())) % 4 + 1)

s文字列はどこにありますか)

于 2011-03-23T23:10:25.030 に答える
1

標準の GetHashCode と % が機能します: Math.Abs("aaaa".GetHashCode()) % numberOfBuckets.

EDITは、GetHashCode() が < 0 を返すことを思い出させてくれた Thomas Levesque に感謝します。正しいコードを持つように Math.Abs​​ を追加しましたが、他の回答のバージョンの方が適切に機能する可能性があります。

于 2011-03-23T23:08:47.403 に答える
-1

共有マシン キーに基づくハッシュ アルゴリズムを使用します。これにより、文字列ごとに一意の識別子が作成されます。整数が必要な場合は、辞書オブジェクトを使用して文字列を int にマップします。新しい文字列を追加するたびに、そのキーを現在の辞書の長さに設定します。最後に、ディクショナリを共有セッションなどのファーム ベースの状態オブジェクトに格納して、各サイト インスタンスがディクショナリを参照できるようにします。

于 2011-03-23T23:12:06.250 に答える