5

Javaでランダム識別子を生成したいと思います。識別子は固定サイズにする必要があり、同じ識別子を 2 回生成する確率は非常に低くする必要があります (システムには約 500 000 人のユーザーがいます)。識別子は、ブルート フォース攻撃によって「推測」することが不可能なほど長くする必要があります。

これまでの私のアプローチは、次のようなものです。

String alphabet = "0123456789ABCDE....and so on";
int lengthOfAlphabet = 42; 
long length = 12; 

public String generateIdentifier(){
    String identifier = "";
    Random random = new Random(); 
    for(int i = 0;i<length;i++){
        identifier+= alphabet.charAt(random.nextInt(lengthOfAlphabet));
    }
    return identifier; 
}

データベースの制約によって一意性を強制しています。既に作成されている識別子にヒットした場合は、使用されていない識別子が見つかるまで生成を続けます。

私の仮定は、lenghtOfAlpahbet と長さを微調整して、探しているプロパティを取得できるということです。

  1. まれな衝突
  2. 力ずくで実行不可能
  3. システムのユーザーが入力する必要があるため、識別子はできるだけ短くする必要があります。

これは良いアプローチですか?「長さ」の価値について考えている人はいますか?

4

2 に答える 2

2

randomUUID はあなたの友達だと思います。固定幅です。http://docs.oracle.com/javase/1.5.0/docs/api/java/util/UUID.html#randomUUID ()

私の数学を正しく覚えていれば、UUID は 32 個の 16 進数 (0-f) であるため、順列の数は 16^32 であり、これは大きな数であるため、推測するのはかなり困難です。

于 2012-10-30T00:55:51.033 に答える
1

シンプルに保ち、組み込みメソッドを使用して、文字列としてエンコードされた通常の疑似乱数整数を表すことをお勧めします。

Random random = new Random(); 

/**
 * Generates random Strings of 1 to 6 characters. 0 to zik0zj
 */
public String generateShortIdentifier() {
    int number;
    while((number=random.nextInt())<0);
    return Integer.toString(number, Character.MAX_RADIX);
}

/**
 * Generates random Strings of 1 to 13 characters. 0 to 1y2p0ij32e8e7
 */
public String generateLongIdentifier() {
    long number;
    while((number=random.nextLong())<0);
    return Long.toString(number, Character.MAX_RADIX);
}

Character.MAX_RADIXは 36 です。これは、0 ~ 9 および A ~ Z のすべてのアルファベットに相当します。つまり、ランダムな整数を 36 進数に変換することになります。

必要に応じて長さを調整できますが、わずか 13 文字で 2^63 の数値をエンコードできます。

編集:0から2 ^ 63までのみを生成するように変更し、負の数は生成しませんが、それはあなた次第です。

于 2012-10-29T20:48:52.693 に答える