たとえば、約1,000万の一意のキーが必要な場合、最善のアプローチは、指数関数的に大きいキースペースを選択し、ランダムに生成を開始することです。 誕生日のパラドックス について読む -それはあなたが心配すべき主なことです。 2 ^ n個の一意で安全なキーが必要な場合は、少なくとも2 ^(2 * n)個の可能な値があることを確認してください。大まかなO(n log n)アルゴリズムは次のとおりです。
- 少なくとも2^50のキースペースを使用します(つまり、2 ^ 50の可能な一意の値を許可します)。そうすれば、データセット全体で衝突がほとんど発生しなくなります。 2 ^ 25を試してみると、キーを取得する確率がほぼ均等になります。
- 必要な数の乱数を生成します
- キーのデータベースにインデックスを付けます(これはO(n lg n)ステップ:ソートです)
- DBをページングし、データセット全体を反復処理して、重複をトリミングします(以下の擬似コード)
- 重複する行を削除すれば完了です。
擬似コード:
$last = null;
while ($current = getnext()) {
if ($last == $current) {
push($toDelete, $current);
}
$last = $current;
}