2016-11-07 9 views
1

固定サイズの6文字の英数字IDを与える関数を作成したいと思います。先頭と最後の文字はアルファでなければなりません。連続した固定サイズのベース36 IDの作成

私はそれらを順番に生成します。私はbase36を使ってアルファベット[0-9A-Z]のアルファベットを使う方法だと思っていますが、開始時と終了時に常にアルファベットが6文字長くなるようにする方法があまりにもわかりません。

たとえば、IDを順番に作成して0から開始すると、両方のベースで0が同じであるため、出力は0になります。

ここで助けとなる効率的なアルゴリズムを知っている人はいますか?あなたがベースの剰余をとり、次いで塩基によって剰余を除算することによって一度に一つの桁を抽出し、base36文字列にint型から変換するための標準的なアルゴリズムを使用するが、追加することができ

おかげ

+0

26^2 * 36^4の可能性があります。あなたは0から番号[A-Z](0-9A-Z){4} [A-Z]のシーケンスに変換するコンバータが必要です。 d0 = n%26、d1 = n/26%36のようなもの; d2 = n/26 * 36%36 ...非常に簡単なトリックを行う必要があります... – CFrei

答えて

1

最初と最後の桁の特殊ケース:

たとえばJavaで:

static String getId(int id) 
{ 
    String s = ""; 
    for(int i = 0; i < 6; i++) 
    { 
     // compute the digit using modulo arithmetic using base 26 
     // for first and last character and base 36 for others 
     int digit; 
     if((i == 0) || (i == 5)) 
     { 
      digit = (id % 26) + 10;   
      id /= 26; 
     } 
     else 
     { 
      digit = id % 36; 
      id /= 36; 
     } 

     // add the digit to the string: 
     if(digit < 10) 
      s = (char)('0' + digit) + s; 
     else 
      s = (char)('A' + (digit - 10)) + s; 
    } 
    return s; 
} 

あなただけそれらをすべて保存するために32ビット整数を必要とする意味26 * 36 * 36 * 36 * 36 * 26 = 1135420416の可能性があります。

関連する問題