9桁のシーケンスの長いリストを生成したいと思います。
それらをIDと呼びましょう。
したがって、各IDは一意であり、主な目的はそれらをすべて実際に異なるものにすることです。1桁または2桁の順序で異なる2つのIDを持つことは許容されません。
新しく生成されたIDを以前に生成されたIDと比較せずに実装する方法について何かアイデアはありますか?
おそらく、それらの文字列がどれだけ近いかを比較するためのいくつかのアルゴリズムまたは単純なMYSQL関数がすでにありますか?
IDに対して次の式を試すことができます-ID値がテーブルにまだ存在しないことを確認するだけで済みます(値を選択するとsalt
、の間の定数で0
あり100
、変更されることはありません-使用することをお勧めします素数であり、絶対にそうではありません0
):
ID = random integer * 101 + salt;
これにより、次のようなID値が生成されます(の場合salt = 73
)。
469956305
017775467
001195913
913620520
156482807
577463533
470183959
049290800
078643925
141526626
これらのID値のいずれか2つを取得して比較すると、2つの数値が1桁または2桁の順序で異なることはないことがわかります。0
との間で可能なすべてのID値を比較するスクリプトを作成しました3000000
が、この形式の2つのID値が1桁または2桁の順序で異なることはありませんでした。自分でテストしたい場合は、(C#で)使用したスクリプトを次に示します。http://ideone.com/lFHnlX-IDEoneのタイムアウトのため、上限を下げました。
一意性をチェックしないことを回避したいのですが、IDを類似させたくないですか?次に、実際にUUID / GUIDを探しています。
MySQLの組み込みuuid()
関数はそこにあなたを連れて行きます。
Robert Harveyが指摘しているように、UUIDは英数字(数値ではない)で9文字より長いですが、何かを犠牲にする必要があります。すべての制約を同時に満たすことはできません。