5

我想在java中生成随机标识符。标识符应该有一个固定的大小,两次生成相同标识符的概率应该很低(系统大约有50万用户)。另外;标识符应该很长,以至于通过暴力攻击“猜测”它是不可行的。

到目前为止,我的方法是这样的:

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 和 length 以获得我正在寻找的属性:

  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 个十六进制数字(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 回答