0

アプリケーションを作成しているときに、データベース内の特定のエンティティ (ABCD など) にランダムなタグを付けたいと考えています。これらは常に 4 文字で、大文字と数字を含めることができます。

問題は、それらをどのように割り当てるかです。これが提供する 160 万の可能性を使用することはありませんが、データベースがいっぱいになると、この L4 疑似コードを使用してランダムな文字列を生成するための「シーク」時間が指数関数的に長くなります。

function makeUniqueKey() {
    while (true) {
        $key = strtoupper(str_random(4));
        if (!DB::table('items')->where('key', '=', $key)->count()) {
            return $key;
        }
    }
}

これはOCDの好奇心の質問だと思いますが、データベース内のアイテムのランダムで一意のキーを作成するための非指数アルゴリズムの巧妙なトリックはありますか?

4

1 に答える 1

1

それらをランダムに割り当てないことが最善です。最も単純なのは増分です (例: aaaa から開始し、ZZZZ まで)。

とにかく、この文字列を数値にマップします。aaaa = 1ZZZZ = 52^4

次に、乱数を選択して、データベースで最初のギャップを検索できます。ストアドプロシージャで実行できるはずです。これにより、データセットが増加するにつれてパフォーマンスが指数関数的ではなく、少なくとも直線的に低下するはずです。

于 2013-08-31T22:56:11.990 に答える