关于代理键:如何在java中生成一个真正唯一的char字符串

How to generate a real unique char only string in java

是否有方法生成唯一的代理字符串,如uuid.randomuuid(),但只包含字符(表示没有数字)?该字符串存储在不同主机上的多个数据库中,并且必须是系统范围内唯一的(即使我同时生成两个键,即通过线程)。


ApacheCommonsLang3有一个名为RandomStringUtils的类,可用于获取随机字母字符串:

1
2
int stringSize = 8;  // just choose the size better suits you
String randomString = RandomStringUtils.randomAlphabetic(stringSize);

如果您需要它是唯一的,即使有多个线程正在运行,那么您将需要一种方法来同步它们(可能使用synchronized块和while循环),并检查该数据库中是否存在与生成的字符串相同的前一个字符串。

编辑-一个粗略的例子

1
2
3
4
5
6
7
8
9
10
11
Set<String> previousKeys = new HashSet<String>();

public String generateKey(int stringSize) {
    String randomString ="";
    synchronized(previousKeys) {
        do {
            randomString = RandomStringUtils.randomAlphabetic(stringSize);
        } while (randomString.length() == 0 || !previousKeys.add(randomString));
    }
    return randomString;
}


刚刚写了这个-随机的大写字符字符串:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package dan;

import java.util.Random;

public class RandText {

    /**
     * @param args
     */

    public static void main(String[] args) {

        String s = getRandomText(100);
        System.out.println(s);

    }


    public static String getRandomText(int len) {
        StringBuilder b = new StringBuilder();
        Random r = new Random();
        for (int i = 0; i<len;i++) {
            char c = (char)(65+r.nextInt(25));
            b.append(c);
        }
        return b.toString();
    }
}


抓起UUID,去掉"-S"。转换字符"1"->"Z"、"2"->"Y"等。


1
2
3
4
String id = UUID.randomUUID().toString().replaceAll("-","");
id.replaceAll("0","zero");
// [...]
id.replaceAll("9","nine");

我对这种方法感到不好。


如果要生成随机字符,请使用随机整数生成器,并让它生成一个随机数65-122。但请记住,91-96在ASCII中不是A-Z或A-Z。请记住,您将希望将此int转换为char。

这可能有帮助:http://www.asciitable.com/