2013-10-05 15 views
12

ショートリンクサービスのIDとして、任意のID(英数字、6文字)を生成する必要があります。IDの固有のランダム生成のための良いアルゴリズム

現在、ランダムな6文字のコードを生成し、dbで検索して以前に使用されていたかどうかを調べ、もしあれば、その処理を繰り返します。私はすべての36^6の組み合わせで一意にする必要があります。システムが成長するにつれて、パフォーマンスは悪化します。

dbを打つのを最小限に抑え、グローバルに状態を保持し、ルックアップに100ms以上かかることはありません。任意の助け

Thxを

+0

描画したい文字セットとは何ですか? – lurker

+0

あなたは6人に限定されていますか?あるいは、「Xy0MVKupFES9NpmZ9TiHcw」のような22人がやりますか? –

+11

重要な質問、なぜあなたはショートリンクサービスのための*ランダムなIDを持っている必要がありますか?連続する数値IDを生成し、選択した数字セットを使用してそれらを基数36に変換します。 – us2012

答えて

8

LCGで次の乱数を生成し、それを基数36に変換して、対応する疑似乱数列を書き込みます。

幸運を祈る!

+1

ええ、これは実際には最良のアイデアかもしれません。私が考えているのは、混乱したフォームからシーケンシャルIDへの逆計算を簡単に逆にする必要があると誤って考えていたからです。しかし、再考する必要はないと私は考えています。だからあなたに+1してください。 – us2012

+0

@ us2012、あなたの答えは私にLCGを思い出させました。 – naitoon

+0

これは、LCGに多少似ていますが、ステップを繰り返す*手順はありませんが、順次IDを乗算するだけで簡単に元に戻すことができます。 – us2012

14

使用連続番号、あなたはキーが既に存在するかどうかを検索するデータベースをヒットする必要はありませんので。今まで割り当てられた最大数を追跡するだけで済みます。

あなたが割り当てられた最初のIDは、その後000000000001のように見えるだろうという事実を好きではない場合は36

をベースに、それを変換し、この順次IDの英数字を作るために、... 00000z000010、。 ..、あなたは数学的なトリックを利用することができます:内部的には連続した数値IDを保持しますが、ユーザが見ることができる外部表現に対しては、それを36^6-1より小さい大きな素数で(mod 36^6) 1679979167は適切な選択です - ベース36に変換する前に。これはあなたのIDが実際にはなくてもランダムに表示されるようにします。

ここで出力のPythonサンプルです:

http://en.wikipedia.org/wiki/Linear_congruential_generator:この問題はよく知られているソリューションを有する

def baseN(num,b,numerals="abcdefghijklmnopqrstuvwxyz"): 
    return ((num == 0) and numerals[0]) or (baseN(num // b, b, numerals).lstrip(numerals[0]) + numerals[num % b]) 

for internalID in range(1,200): 
    mangled = (internalID*1679979167)%(36**6) 
    print internalID, mangled, baseN(mangled,36) 

(ベイスンコードはhereからjellyfishtreeだ場合)


1 1679979167 rs7s7z 
2 1183175998 jkfkfy 
3 686372829 bcncnx 
4 189569660 34v4vw 
5 1869548827 ux2x3v 
6 1372745658 mpapbu 
7 875942489 ehihjt 
8 379139320 69q9rs 
9 2059118487 y1y1zr 
10 1562315318 pu5u7q 
11 1065512149 hmdmfp 
12 568708980 9eleno 
+0

(素数法を解き明かそうとしています)だから、考えてみましょう...あなたは内部整数からユーザに見える表現に可逆マッピングを行いましたか?私は接続されたシステムに何が見えるのだろうかと疑問に思っています... – Dogweather

+0

範囲[0,36^6-1]からのリバーシブルマッピングを '順次'未熟な目。内部IDはシーケンシャルな番号になりますが、外部、顧客、ユーザーなどのすべてがマップされたバージョンを表示します。 – us2012

+0

(問題を編集して修正しました - コードの前のバージョンは結果のモデム36^6を忘れていました) – us2012

関連する問題