2

makeKey() と keyExists() の 2 つの関数があります。

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

非常に単純なことをする必要がありますが、それを行う最も簡単な方法がわかりません。

キーを作成する必要があるだけで、それがテーブルに存在する場合は、もう一度キーを作成し、一意のキーが返されるまで繰り返します。whileループで十分だと思いますか?

ありがとうございます。かなり基本的な質問をお許しください。昨日、太陽の下で脳を調理したと思います。

4

9 に答える 9

5

do-whileループを使用します。

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

これにより、キーがまだ存在しなくなるまで、反復ごとに新しいキーが生成されます。

于 2009-06-01T14:06:58.767 に答える
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
于 2009-06-01T14:11:03.393 に答える
2

私のphpは少し錆びているので、次の疑似コードを検討してください:

$key_exists = true;
while($key_exists) {
       $key = generateKey();
       $key_exists = checkKey($myKeysHash, $key);
}
// $key is now unique and ready to use
于 2009-06-01T14:05:18.397 に答える
1

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

于 2009-06-01T14:13:54.573 に答える
0

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

より良いアプローチは、可能性のあるキーを生成し、それを永続化しようとすることです。おそらく、キーのテーブルに対して INSERT を実行し、成功するまで別のキーで再試行します。

于 2009-06-01T14:09:39.370 に答える
0

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

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

于 2009-06-01T14:36:05.310 に答える
0

5 桁の数字に固定されていない場合は、ID のハッシュと名前列を使用することを検討できます。

于 2009-06-01T14:12:34.560 に答える
0

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

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

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

于 2009-06-01T14:13:56.883 に答える
0

ランダムである必要がありますか?変数をインクリメントし、次の変数を格納して別のフィールドで使用するだけです。

于 2009-06-01T14:16:46.673 に答える