如何在java中生成真正唯一的纯字符字符串

如何在java中生成真正唯一的纯字符字符串,java,surrogate-key,Java,Surrogate Key,是否有方法生成唯一的代理字符串,如UUID.randomUUID(),但仅包含字符(表示没有数字)?该字符串存储在不同主机上的多个数据库中,并且必须是系统范围内唯一的(即使我同时生成两个密钥,即通过线程生成)。刚刚编写了这个-随机大写字符字符串: package dan; import java.util.Random; public class RandText { /** * @param args */ public static void mai

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

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

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();
    }
}
package-dan;
导入java.util.Random;
公共类文本{
/**
*@param args
*/
公共静态void main(字符串[]args){
字符串s=getRandomText(100);
系统输出打印项次;
}
公共静态字符串getRandomText(int len){
StringBuilder b=新的StringBuilder();
随机r=新随机();
for(int i=0;i有一个名为的类,可用于获取随机字母字符串:

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;
}
Set previousKeys=new HashSet();
公共字符串生成器键(int stringSize){
字符串随机字符串=”;
已同步(以前的键){
做{
randomString=RandomStringUtils.RandomAlphabic(stringSize);
}while(randomString.length()==0 | |!previousKeys.add(randomString));
}
返回随机字符串;
}

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

这有助于:


我对这种方法感觉很糟糕。

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

你说的仅字符是什么意思?如果你使用.toString()在UUID上,您将得到一个十六进制表示。@Dan Matthews编辑了我的问题-char仅表示没有数字/数字->只有字母a-Z为什么字符串中不能有数字?的精确副本如果要确保随机字符串是唯一的,您必须存储已使用的字符串,然后重试获取下一个随机字符串但是他使用的UUID之前是随机的但很大。正是字符串的大小使得生成相同ID的概率非常小。冲突的概率是n^x,其中x是长度,n是字符空间,在本例中是26^x,100个字符长,这是不可信的非常罕见,可以称为唯一。如果唯一性不是一个严格的要求,那么您的方法是有效的(尽管您可能希望使用更好的随机生成器)。如果这是一个严格的要求,你需要检查每个键以确保它是唯一的。但他愿意使用UUID,只要它不生成数字。我只是不明白你的论点。实现这样一个系统会在插入上带来很大的开销。这就是UUID生成器的要点-空间足够大你不会有冲突。我也不明白随机数发生器的意义-你想要什么-他出去买一个硬件单元?我理解你的意思-我只是说从UUID获得两个相同的密钥是(非常)低概率但并非不可能。OP需要决定他是否对该低概率事件感到满意(他可能不知道UUID不能保证唯一性)。关于随机生成器,。由于Uniquences无论如何都不是garantied,因此我更喜欢此解决方案而不是apache commons lang(因为我必须使用额外的库)。我将生成100个字符大小的代理(同步)。如果有第一个副本,我将执行“错误修复”:-)也许我必须找到一个解决方案,将所有密钥冗余存储在一台特定的机器上……但我想解决这个问题……+1保证唯一性的唯一方法是检查每个密钥与之前的密钥。向上投票的注释=酷(thx!),没有注释的向下投票=一文不值
String id = UUID.randomUUID().toString().replaceAll("-", "");
id.replaceAll("0","zero");
// [...]
id.replaceAll("9","nine");