有没有办法在Java中生成8个字符长的随机和唯一字符串?
String id = getRandomString();
然后我会以wf41Av5g
答案 0 :(得分:23)
您可以使用RandomStringUtils
import org.apache.commons.lang.RandomStringUtils;
public class RandomStringUtilsTrial {
public static void main(String[] args) {
System.out.print("8 char string >>>");
System.out.println(RandomStringUtils.random(8, true, true));
}
}
答案 1 :(得分:11)
唯一性属性取决于您使用它的范围。 Java当然可以生成随机字符串,但如果您需要通用唯一标识符,则可以使用UUID
类。
String unique = UUID.randomUUID().toString();
答案 2 :(得分:11)
如果唯一性很重要,则不能简单地随机生成字符串。没有办法避免碰撞。甚至UUID都可能发生冲突,尽管这种情况不太可能发生。
您可以记录您使用过的字符串,当您生成新的随机字符串时,请检查记录是否重复,如果是,请将其丢弃并重试。
但是,我建议你不要生成随机数。相反,保留一个计数器,并加密其输出以产生随机数字。如果你这样做,保证永远不会碰撞。请参阅an earlier answer of mine或one by Rossum
答案 3 :(得分:2)
您可以根据当前时间创建此字符串。
例如:
2014 06 04 16 21 20 79 ---> 14 06 04 16 21 20 79
然后你可以使用表格(http://en.wikipedia.org/wiki/Base64翻译一个字母数字字符的每两位数字(除了最后两位) - 注意它们都小于59)
然后你会收到
14 - OOGEQVU79< - 正好8个字符。有点复杂,但如果你不经常调用你的函数0.01 s
,它会起作用答案 4 :(得分:0)
public String getRandomString(int length, char[] characterSet) {
StringBuilder sb = new StringBuilder();
for (int loop = 0; loop < length; loop++) {
int index = new Random().nextInt(characterSet.length);
sb.append(characterSet[index]);
}
String nonce = sb.toString();
return nonce;
}
答案 5 :(得分:0)
使用java.util.UUID快速而肮脏的解决方案:
public String getRandomString(int length) {
return UUID.randomUUID().toString().subSequence(0, length);
}
答案 6 :(得分:0)
请尝试以下代码:
private String uniqid() {
Random random = new Random();
String tag = Long.toString(Math.abs(random.nextLong()), 36);
return tag.substring(0, 8);
}
答案 7 :(得分:0)
到目前为止,您一定得到了答案,但对于访问此页面的人,请尝试以下代码:
公共类RandomValueXML {
{{1}}
}
这里使用set确保了唯一性,而使用HashSet可确保在读写时获得更好的性能。
答案 8 :(得分:0)
我知道这是一篇过时的文章,但这可能会对某人有所帮助。
这个为我工作:
System.out.println(UniqueIdGenerator.fromBase10(System.currentTimeMillis()));
在同一JVM上每毫秒应该唯一。
具有:
public class UniqueIdGenerator {
private static final String MIX_STRING = "abcdefghijklmnopqrstuvwxyz1234567890";
private static final int MIX_STRING_LENGTH = MIX_STRING.length();
public static String fromBase10(final long base10) {
if (base10 == 0)
return "0";
long temp = base10;
final StringBuilder sb = new StringBuilder();
while (temp > 0) {
temp = fromBase10(temp, sb);
}
return sb.reverse().toString();
}
private static Long fromBase10(final long base10, final StringBuilder sb) {
final int rem = (int) (base10 % MIX_STRING_LENGTH);
sb.append(MIX_STRING.charAt(rem));
return base10 / MIX_STRING_LENGTH;
}
}
您还可以更改MIX_STRING
中的字符顺序,甚至添加大写字母或符号。
答案 9 :(得分:0)
我不知道是否有一种方法可以生成 8 位唯一随机字符串,但我会创建一个离线密钥生成器服务,该服务不断生成随机密钥并将它们插入到密钥表中(如果密钥不存在)表,每当您的在线应用需要密钥时,它就可以从其中一个预先生成的密钥中获取。
答案 10 :(得分:0)
由于以上答案都不能确保唯一性,我决定添加另一个答案。
首先我们在一个数组中定义所有有效的选项:
char[] chars = new char[]{ 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
'1', '2', '3', '4', '5', '6', '7', '8', '9', '0' };
现在我们可以将算法修改为 Random shuffling of an array,以获得前 8 个元素:
Random rnd = new Random();
int charsLength = chars.length;
int passLength = 8;
StringBuilder password = new StringBuilder();
for (int i = 0; i < passLength; i++)
{
int index = rnd.nextInt(charsLength - i - 1);
// Simple swap
char a = chars[i + index];
chars[i + index] = chars[i];
chars[i] = a;
password.append(a);
}
System.out.print(password);
它确保唯一性,一旦 char
位于数组的第 8 个位置,它就不是下一轮的有效选择。
我得到的输出很少:
ifJjuYrR
NpY3TfIU
LGFm8Ng9
sV4Gctb7
4fyhlSuQ
答案 11 :(得分:-2)
s = sample(x = c("x1","x2","x3"),size = 2,replace = F)
t.test(eval(parse(text=s[1])),eval(parse(text=s[2])))
以十六进制格式为您提供独特的8个字符串。