2009-06-01 9 views
2

私はmakeKey()とkeyExists()という2つの関数を持っています。一意のキーを作成する - 最も効率的な方法

makeKey()は単純に5桁のランダムな英数字キーを生成し、keyExists()はこのキーを唯一の引数として受け入れ、テーブル内を検索し、存在するかどうかによってtrue/falseを返します。

私は何か非常に単純なことをする必要がありますが、私はそれを行う最も速い方法を理解できません。

キーを作成し、それがテーブルに存在する場合は、キーをもう一度作成するなどして、一意のキーが返されるまで続けます。 whileループで十分でしょうか?

かなり基本的な質問を許してください、私は昨日私の脳を太陽の下で調理したと思います。

+0

99999行があるとしばらく時間がかかります。 –

答えて

5

- whileループ:これは、すべての新しいキーを生成します

do { 
    $newKey = makeKey(); 
} while (keyExists($newKey)); 

をキーがまだ存在しなくなるまで繰り返します。

2

私のPHPは少しさびているので、この擬似コードを検討:私はdo使用したい

$key_exists = true; 
while($key_exists) { 
     $key = generateKey(); 
     $key_exists = checkKey($myKeysHash, $key); 
} 
// $key is now unique and ready to use 
0

あなたはテーブルに言及していますので、これらのキーをデータベースに保存しているのでしょうか?そうであれば、あなたのアプローチは競合状態に陥るでしょう - 別のプロセスがそのキーを使用する前に、そのキーを使用しても問題ありません。

もっと良いアプローチは、鍵のテーブルにINSERTを実行し、成功するまで別の鍵で再試行することによって、可能な鍵を生成して永続化しようとします。

5

鍵のスペースがいっぱいになると、作成、検査に依存するすべての解決策は、ひどいパフォーマンスをもたらすことになります。自動生成された列(IDまたはGUID)を使用して一意のキーを生成する方がよいでしょう。英数字にする必要がある場合は、マッピング機能を使用してビットのグループを選択し、それらをアルファベットのインデックスとして使用することで、アルファベットに変換することができます。

擬似コード

alphabet = "ABCDE...789"; 
key = insert new row, get autogenerated key 
alphaKey = ""; 
while (get n bits from key) 
    alphaKey += alphabet[bits] 
done 
echo alphaKey 
0

あなたは5桁の番号に固定されていない場合、あなたはあなたのIDのハッシュ+名前欄を使用して考えることができます。

1

uniqid()のような組み込みのPHP関数を使用しないのはなぜですか?

0

また、何らかのデータベースを使用していると仮定します。

データベースで一意の自動インクリメントID列を使用できませんか?データベースエンジンが同じIDを2回割り当てないため、キーが存在するかどうかを確認する必要がなくなります。

しかし、新しい機能をコーディングするのではなく、アプリケーションのロジックを変更する必要があります。

0

ランダムである必要がありますか?変数を増分し、次の変数を別のフィールドで使用するために保存します。

0

while (keyExists($newKey = makeKey()));

キーは、それが新しいものを生成しますが存在する場合は、チェックを行うためのおそらく最も簡単な方法。新しいユニークキーを取得する前に、何度もデータベースをチェックする必要がある衝突がたくさんある場合は、おそらくmakeKey()アルゴリズムの再考が必要になります。 DBへのコールは高価ですが、スクリプトをより迅速かつ効率的にすることができるコールが少なくなります。

関連する問題