MySQLを使用してランダムかつユニークな8文字の文字列を生成する 質問する

MySQLを使用してランダムかつユニークな8文字の文字列を生成する 質問する

私は、ある時点で車両が関係するゲームに取り組んでいます。車両のナンバープレートを格納する列「plate」を含む、車両に関するデータを含む「vehicles」という名前の MySQL テーブルがあります。

さて、ここで問題が起こります。新しい車両を作成する前に、未使用のナンバープレートを見つける必要があります。これは、英数字 8 文字のランダムな文字列である必要があります。これを実現するには、プログラミング言語である Lua の while ループを使用して文字列を生成し、DB をクエリして使用されているかどうかを確認します。ただし、車両の数が増えると、この方法は今よりもさらに非効率になると予想されます。そのため、MySQL クエリを使用してこの問題を解決してみることにしました。

必要なクエリは、テーブルにまだ存在しない 8 文字の英数字文字列を生成するだけです。generate&check ループ アプローチを再度考えましたが、より効率的な方法がある場合に備えて、この質問をそれに限定しません。許可されているすべての文字を含む文字列を定義し、ランダムにサブストリング化することで、文字列を生成することができました。

どのような助けでも大歓迎です。

ベストアンサー1

衝突の可能性については気にしません。ランダムな文字列を生成し、それが存在するかどうかを確認します。存在する場合は、もう一度試してください。すでに大量のプレートが割り当てられていない限り、数回以上実行する必要はありません。

純粋な (My)SQL で 8 文字の疑似ランダム文字列を生成する別のソリューション:

SELECT LEFT(UUID(), 8);

次のコードを試すことができます (疑似コード):

DO 
    SELECT LEFT(UUID(), 8) INTO @plate;
    INSERT INTO plates (@plate);
WHILE there_is_a_unique_constraint_violation
-- @plate is your newly assigned plate number

この投稿は予想外の注目を集めたので、ここで強調しておきたいのはADTCのコメント: 上記のコードは非常に愚かであり、連続した数字を生成します。

少しだけ愚かなランダムさを減らすには、代わりに次のようなことを試してください:

SELECT LEFT(MD5(RAND()), 8)

そして、真の(暗号的に安全な)ランダム性を得るには、RANDOM_BYTES()ではなくを使用しますRAND()(ただし、その場合は、このロジックをアプリケーション層に移動することを検討します)。

おすすめ記事