2016-06-14 3 views
0

私はusersテーブルを持っており、それぞれのユーザーに対して一意のランダムな英数字の "id"を作成する必要があります。この識別子は、必要があります。与えられたパターンに一致するランダムな見た目の一意の識別子を生成する方法

  • マッチにパターンAAAA-1234(4つの文字、4つの数字)

を探してランダムで一意であることまではランダムに生成する文字列を維持するより良い方法はあります私はまだデータベースにないものを見つけますか?

+0

「ランダムな見た目」と言ったとき、その数字は重大ではないはずですか? –

+0

@PavelPetrov正確には – nXu

+0

必要なアルゴリズムは、クレジットカード番号を生成するアルゴリズムと似ています。おそらく、暗号化SEでこの質問をすると、より良い答えを得るでしょう。 –

答えて

2

退屈な古い順番で各ユーザーに整数を割り当てます(または、あなたが言及した他のIDを使用します)。それを$xと呼んでください。

セット$x = (($x + 2135587861) * 2654435769) & 0xffffffff

セット$x = $x^($x >> 15)

$x = (($x + 2135587861) * 2654435769) & 0xffffffffを再度設定します。

$x % 26を計算し、結果に基づいてa-zを選択します。 $x = $x/26を設定します。 4回繰り返します(私はPHPを知らないので、ここで口頭で説明します)。

$x % 10を計算し、結果に基づいて数字を選択してください。 $x = $x/10を設定します。 4回繰り返します。私が手

第6の結果は以下のとおりです。

HSQG-2102 
DNQO-1176 
TEKJ-5435 
EHWX-6540 
UPPH-0450 
MVIX-5036 

はまさに完璧ではないのですが、それは非自明です。おそらくそれで十分でしょう。

また、衝突を起こす前の最初の40億人(ish)のユーザーにしか動作しませんが、それはとにかく文字列形式の限界からわずかです。

+0

私は実際にこの数字を理解していませんが、正しく見れば、基本的に各$ xは$ x <16^8までユニークになる1つの文字列にマップされます。 – nXu

+1

はい、その上限まで一意です。すべての魔法の数字は任意で、私はちょうどうまくいくものを選んだ。私は黄金比の最初の64ビットを使用しました。唯一の制限は、乗数が奇数でなければならないということです。これは、すべての入力が '&0xffffffff'の後であっても一意の出力にマップする数学的性質を持っています。すべての操作が同じプロパティを持っているので、2つの入力を同じ出力(折り返し)に折り畳むわけではなく、理論的に元の数を見つけるために操作を元に戻すことができます。 – sh1

+0

説明ありがとうございます! – nXu

関連する問題