java中的随机标识符

mag*_*ium 5 java security random statistics

我想在java中生成随机标识符.标识符应该具有固定的大小,并且生成相同标识符两次的概率应该非常低(系统具有大约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; 
}
Run Code Online (Sandbox Code Playgroud)

我通过数据库中的约束强制执行唯一性.如果我点击已经创建的标识符,我将继续生成,直到找到一个未使用的标识符.

我的假设是我可以调整lenghtOfAlpahbet和length以获得我正在寻找的属性:

  1. 罕见的碰撞
  2. 蛮力不可行
  3. 标识符应尽可能短,因为系统的用户必须键入它.

这是一个好方法吗?有没有人对"长度"的价值有任何想法?

Joe*_*erg 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);
}
Run Code Online (Sandbox Code Playgroud)

Character.MAX_RADIX是 36,它等于所有 0 到 9 以及 A 到 Z 的字母表。简而言之,您将把随机整数转换为以 36 为基数的数字。

如果需要,您可以调整所需的长度,但只需 13 个字符即可编码 2^63 个数字。

编辑:将其修改为仅生成 0 到 2^63,没有负数,但这取决于您。