我一直在寻找一种简单的 Java算法来生成伪随机的字母数字字符串。 在我的情况下,它将用作唯一的会话/密钥标识符,在“超过500K+
世代中“可能”是唯一的(我的需求实际上不需要任何更复杂的东西)。
理想情况下,我可以根据自己的独特性要求指定长度。 例如,生成的长度为12的字符串可能看起来像"AEYGF7K0DM1X"
。
#1楼
import java.util.Random;
public class passGen{
//Verison 1.0
private static final String dCase = "abcdefghijklmnopqrstuvwxyz";
private static final String uCase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
private static final String sChar = "!@#$%^&*";
private static final String intChar = "0123456789";
private static Random r = new Random();
private static String pass = "";
public static void main (String[] args) {
System.out.println ("Generating pass...");
while (pass.length () != 16){
int rPick = r.nextInt(4);
if (rPick == 0){
int spot = r.nextInt(25);
pass += dCase.charAt(spot);
} else if (rPick == 1) {
int spot = r.nextInt (25);
pass += uCase.charAt(spot);
} else if (rPick == 2) {
int spot = r.nextInt (7);
pass += sChar.charAt(spot);
} else if (rPick == 3){
int spot = r.nextInt (9);
pass += intChar.charAt (spot);
}
}
System.out.println ("Generated Pass: " + pass);
}
}
因此,这只是将密码添加到字符串中,是的,很好地将其签出……非常简单。 我写的
#2楼
一种简短的解决方案,但仅使用小写和数字:
Random r = new java.util.Random ();
String s = Long.toString (r.nextLong () & Long.MAX_VALUE, 36);
大小以36为底数大约为12位,因此无法进一步改善。 当然,您可以附加多个实例。
#3楼
您可以为此使用Apache库: RandomStringUtils
RandomStringUtils.randomAlphanumeric(20).toUpperCase();
#4楼
这是一个Scala解决方案:
(for (i <- 0 until rnd.nextInt(64)) yield {
('0' + rnd.nextInt(64)).asInstanceOf[Char]
}) mkString("")
#5楼
public static String generateSessionKey(int length){
String alphabet =
new String("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"); //9
int n = alphabet.length(); //10
String result = new String();
Random r = new Random(); //11
for (int i=0; i<length; i++) //12
result = result + alphabet.charAt(r.nextInt(n)); //13
return result;
}
#6楼
使用apache库可以在一行中完成
import org.apache.commons.lang.RandomStringUtils;
RandomStringUtils.randomAlphanumeric(64);
这是文档http://commons.apache.org/lang/api-2.3/org/apache/commons/lang/RandomStringUtils.html
#7楼
令人惊讶的是,这里没有人建议这样做,但是:
import java.util.UUID
UUID.randomUUID().toString();
简单。
这样做的好处是,UUID很好且很长,并且保证几乎不可能发生碰撞。
维基百科对此有很好的解释:
“ ...仅在接下来的100年中每秒生成10亿个UUID之后,仅创建一个副本的可能性就约为50%。”
http://zh.wikipedia.org/wiki/Universally_unique_identifier#Random_UUID_probability_of_duplicates
前4位是版本类型,而第2位是版本,因此您可以获取122位随机数。 因此,如果您愿意 ,可以从末尾截断以减小UUID的大小。 不建议这样做,但是您仍然有很多随机性,足以轻松完成500k条记录。
#8楼
如果您的密码必须包含数字字母特殊字符,则可以使用以下代码:
private static final String NUMBERS = "0123456789";
private static final String UPPER_ALPHABETS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
private static final String LOWER_ALPHABETS = "abcdefghijklmnopqrstuvwxyz";
private static final String SPECIALCHARACTERS = "@#$%&*";
private static final int MINLENGTHOFPASSWORD = 8;
public static String getRandomPassword() {
StringBuilder password = new StringBuilder();
int j = 0;
for (int i = 0; i < MINLENGTHOFPASSWORD; i++) {
password.append(getRandomPasswordCharacters(j));
j++;
if (j == 3) {
j = 0;
}
}
return password.toString();
}
private static String getRandomPasswordCharacters(int pos) {
Random randomNum = new Random();
StringBuilder randomChar = new StringBuilder();
switch (pos) {
case 0:
randomChar.append(NUMBERS.charAt(randomNum.nextInt(NUMBERS.length() - 1)));
break;
case 1:
randomChar.append(UPPER_ALPHABETS.charAt(randomNum.nextInt(UPPER_ALPHABETS.length() - 1)));
break;
case 2:
randomChar.append(SPECIALCHARACTERS.charAt(randomNum.nextInt(SPECIALCHARACTERS.length() - 1)));
break;
case 3:
randomChar.append(LOWER_ALPHABETS.charAt(randomNum.nextInt(LOWER_ALPHABETS.length() - 1)));
break;
}
return randomChar.toString();
}
#9楼
public static String getRandomString(int length)
{
String randomStr = UUID.randomUUID().toString();
while(randomStr.length() < length) {