Java中的8个字符串唯一字符串

时间:2011-10-17 08:58:41

标签: java string

有没有办法在Java中生成8个字符长的随机和唯一字符串?

String id = getRandomString();

然后我会以wf41Av5g

为例

12 个答案:

答案 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 mineone 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 - O
06 - G
04 - E
16 - Q
21 - V
20 - U

OGEQVU79< - 正好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个字符串。