何百万ものユーザーアカウントがあり、それらのデータをデータベースのN個のテーブル(user_1、user_2、...、user_N)に分散させたいと思います。ユーザーアカウントは3〜8文字で構成されています。だから、私は次のようなテーブルサフィックスを返す関数が必要です
int getTableSuffix(String userAccount);
結果は、1からNまでの一様分布です。
この仕事のための安いハッシュアルゴリズムを知っていますか?
何百万ものユーザーアカウントがあり、それらのデータをデータベースのN個のテーブル(user_1、user_2、...、user_N)に分散させたいと思います。ユーザーアカウントは3〜8文字で構成されています。だから、私は次のようなテーブルサフィックスを返す関数が必要です
int getTableSuffix(String userAccount);
結果は、1からNまでの一様分布です。
この仕事のための安いハッシュアルゴリズムを知っていますか?
最初の1〜3文字のASCII値を取得し、それらの積を見つけて、数値を返すことができます。
または、実際に文字をテーブルプレフィックスとして使用することもできます。Users_AA、Users_ABなど。
ただし、このデータにはどのデータベースを使用していますか?最近のほとんどのデータベースでは、同じデータを格納するために複数のテーブルを作成する必要はありません。何百万ものレコードがあっても。テーブルの適切なインデックス付けは、パフォーマンスの問題を解決するのに十分すぎるはずです。
文字列ハッシュ関数を探しているのか、文字列に基づいて分割する方法を探しているのかは明確ではありません。
優れた文字列ハッシュ関数は各文字を使用し、文字の位置を考慮します。たとえば、djb2は次のようなものを使用します(擬似コード)。
hash = 5381
foreach (ch in str)
hash = hash * 33 + ch
ハッシュが何であれ、モジュロ演算を使用してテーブルの数で分割します。
table = hash % count
データベースに組み込まれているパーティショニング機能がある場合は、それを使用することをお勧めします。