個々の注文に対して 4 桁の確認コードを生成する必要があるシナリオがあります。ほぼ同時に2つの正確なコードが生成される可能性が低いため、ランダムコードだけを実行したくありません。各注文の ID を使用して、そこから 4 桁のコードを生成する方法はありますか? 最終的にこれで繰り返しコードを作成することになることはわかっていますが、ほぼ同時に生成されるわけではないので問題ありません。
2 に答える
ID に基づいてコードを作成する必要がありますか? 4 桁では 1 万通りの値しか得られないため、スクリプトを使用してそれらすべてを生成し、データベース テーブルに放り込むことができます。次に、必要なときにデータベースからランダムなものを引き出し、使い終わったら元に戻します。
コード表は次のようになります。
code
: コードuuid
: UUID、ここでの NULL 値は、このコードが無料であることを示します。
次に、コードを取得するには、まず UUID を生成し、次のuuid
ようにします。
update code_table
set uuid = ?
where code = (
select code
from code_table
where uuid is null
order by random()
limit 1
)
-- Depending on how your database handles transactions
-- you might want to add "and uuid is null" to the outer
-- WHERE clause and loop until it works
(あなたの はどこ?
でしょうuuid
)安全な方法でコードを予約してから、次のようにします。
select code
from code_table
where uuid = ?
(ここ?
でもあなたuuid
のです)データベースからコードを引き出します。
後で、誰かがコードを何かに使用し、次のようにします。
update code_table
set uuid = null
where code = ?
(コードはどこにありますかcode
)コードをプールに解放します。
可能なコードは 1 万個しかありません。これは、order by random()
.
このアプローチの優れた利点は、無料のコードがいくつあるかを簡単に確認できることです。これにより、コード プールを毎日/毎週/毎月/... 自動的にチェックし、無料コードの数がコード スペース全体の 20% などを下回った場合に文句を言うことができます。
重複を避けたい場合は、とにかく使用中のコードを追跡する必要があるため、すべてを 1 か所で管理してみませんか?
注文 ID が 4 桁を超える場合、すでに生成された値の配列で生成された値をチェックせずに理論的には不可能です。次のようなことができます。
require 'mutex'
$confirmation_code_mutex = Mutex.new
$confirmation_codes_in_use = []
def generate_confirmation_code
$confirmation_code_mutex.synchronize do
nil while $confirmation_codes_in_use.include?(code = rand(8999) + 1000)
$confirmation_codes_in_use << code
return code
end
end
$confirmation_codes_in_use
コードを使用した後は、忘れずにクリーンアップしてください。