0

データベースをシャーディングし、ユーザーIDに基づいてさまざまなユーザーをさまざまなホームサーバーに割り当てることを検討しています。ユーザーIDは10文字の文字列です(例:「f4gKUKkj91」)...各サーバーのIDは1〜1000です。phpでハッシュ関数を作成して、各ユーザーIDを特定のシャードに一意かつ一貫して割り当てるにはどうすればよいですか。ユーザーIDが整数の場合、私は実行できますuserid % 1000 ...しかし、それらは英数字であるため、phpでの分散でこれを実行する方法がわかりません。

ありがとうございました!

4

2 に答える 2

3

英数字のユーザー ID の数値ハッシュを提供するcrc32()を使用できます。

于 2009-11-23T20:30:17.987 に答える
1

これは完全なアルゴリズムではありません。小さい ID 番号がわずかに優先されるからです。いわば、ユーザー ID がかなり均等に分散されていることを前提としています。そうでない場合、配布がうまくいかない可能性があります。

あなたのアルファベットが何であるかを把握し、次のような文字列に入れます。$str = '0123456789abcdefghijklmnopqrstuvwxxyzABCDEFGHIJKLMNOPQRSTUVXYZ';この文字列にはn文字があります。ここで、ユーザー ID を基数nの整数として扱います。

文字ごとに、文字列内のインデックスを見つけます (0 ベース)。このインデックスを n xで乗算します。ここで、x は元の文字列の文字位置で、0 から始まります。これらをすべて足し合わせて、和のモジュロをとります。

おそらく、これを数文字だけ行いたいと思うでしょう。数文字を読み取ると、合計が非常に大きくなり、大きな整数演算に適した関数を使用しない限り、PHP はそれを適切に処理できません (確かにGMPなどを使用しますが、あなたのケースには理想的ではないかもしれません)。ネイティブ整数を使用している場合は、可能な最大合計が 2^31 (n x +n x+1 +...+n) を超える前に停止します。

最初から開始することも、逆方向に進むこともできます (逆方向は通常の整数表記に対応します)。ID 生成の仕組みによっては、そのうちの 1 つが適している場合があります。

于 2009-11-23T20:31:35.147 に答える