2

有没有办法生成一个唯一的代理字符串,如 UUID.randomUUID() 但只包含字符(意味着没有数字)?该字符串存储在不同主机上的多个数据库中,并且必须在系统范围内是唯一的(即使我同时生成两个密钥 - 即通过线程)。

4

5 回答 5

2

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

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

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

编辑 - 一个粗略的例子

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;
}
于 2012-08-31T12:44:38.233 回答
1

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

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();
    }
}
于 2012-08-31T12:43:15.660 回答
0

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

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

于 2012-08-31T12:44:41.673 回答
0
String id = UUID.randomUUID().toString().replaceAll("-", "");
id.replaceAll("0","zero");
// [...]
id.replaceAll("9","nine");

我对这种方法感觉不好。

于 2012-08-31T12:49:02.417 回答
0

抓住你的 UUID,去掉“-”。转换字符 '1' -> 'Z'、'2' -> 'Y' 等。

于 2012-08-31T12:55:02.723 回答