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

Java中8个字符的唯一字符串,java,string,random,Java,String,Random,有没有办法在Java中生成8个字符长的随机唯一字符串 String id = getRandomString(); 然后,id将是例如wf41Av5g唯一性属性取决于您使用它的范围。Java当然可以生成随机字符串,不过如果您想要一个通用唯一的标识符,可以使用类 public String getRandomString(int-length,char[]characterSet){ StringBuilder sb=新的StringBuilder(); for(int-loop=0;loop1

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

String id = getRandomString();

然后,
id
将是例如
wf41Av5g

唯一性属性取决于您使用它的范围。Java当然可以生成随机字符串,不过如果您想要一个通用唯一的标识符,可以使用类

public String getRandomString(int-length,char[]characterSet){
StringBuilder sb=新的StringBuilder();
for(int-loop=0;loop
使用以下方法快速解决脏污问题:


请尝试以下代码:

private String uniqid() {
    Random random = new Random();
    String tag = Long.toString(Math.abs(random.nextLong()), 36);
    return tag.substring(0, 8);
}
你可以用


如果唯一性很重要,那么不能简单地随机生成字符串。没有办法避免碰撞。即使UUID也会发生碰撞,尽管可能性不大

您可以保留已使用字符串的记录,当您生成新的随机字符串时,请检查该记录是否重复,如果重复,请丢弃该记录并重试


但是,我建议您不要生成随机数。相反,保留一个计数器,并对其输出进行加密以生成随机数。如果你做得好的话,它们保证永远不会碰撞。请参阅,或

您可以基于当前时间创建此字符串

例如:

2014 06 04 16 21 20 79--->14 06 04 16 21 20 79

然后,您可以使用表为字母数字字符翻译每两位数字(最后两位除外)(-注意,所有数字都小于59)

然后你会收到

14-O
06-G
04-E
16-Q
21-V
20-U


OGEQVU79现在,您一定已经得到了答案,但是对于到达此页面的用户,请尝试以下代码:

public class RandomValueXML {

    public static void main(String[] args) {
        
        System.out.println(org.apache.commons.lang3.RandomStringUtils.random(6, true, true)); 

    }
    
    static Set<String> getRandomUniqueStrings(int count, int length, boolean letters, boolean numbers){
        Set<String> rus = new HashSet<>();
        
        while (rus.size() < count){
            rus.add(RandomStringUtils.random(length, letters, numbers));
        }
        
        return rus;
    } 
}
公共类RandomValueXML{
公共静态void main(字符串[]args){
System.out.println(org.apache.commons.lang3.RandomStringUtils.random(6,true,true));
}
静态集合GetRandomUniqueString(整数计数、整数长度、布尔字母、布尔数字){
Set rus=新的HashSet();
while(rus.size()
在这里,set的使用确保了唯一性,而HashSet的使用确保了读写时更好的性能

long unixTime = System.currentTimeMillis() / 1000L;
String unique_no=Long.toHexString(unixTime).toUpperCase();

以十六进制格式为您提供唯一的8个字符字符串

我知道这是一个老帖子,但这可能会帮助一些人

这一个对我有用:

System.out.println(UniqueIdGenerator.fromBase10(System.currentTimeMillis()));
在同一JVM上每毫秒都应该是唯一的

与:


您还可以在
MIX\u STRING
中更改字符顺序,甚至添加大写字母或符号。

我不知道是否有一种方法可以生成8位唯一的随机字符串,但我会创建一个离线密钥生成器服务,不断生成随机密钥,并将其插入密钥表中。如果密钥不在表中,并且每当您的在线应用程序需要密钥时,它都可以从一个预生成的密钥中提取。

由于上面的答案都不能确保唯一性,我决定添加另一个答案。

首先,我们定义数组中的所有有效选项:

char[]chars=新字符[]{'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' };
现在我们可以将算法变异为,以获得前8个元素:

Random rnd=new Random();
int charsllength=字符长度;
int passLength=8;
StringBuilder密码=新建StringBuilder();
for(int i=0;i
它确保了唯一性,因为一旦
字符
位于数组的前8位,它就不是下一轮的有效选择

我得到的输出很少:

ifJjuYrR
NpY3TfIU
LGFm8Ng9
sV4Gctb7
4fyhlSuQ

如果您想要超过62^8个(假设您只想要字母数字)。。。您可能需要一个随机字符串,然后根据已经生成的字符串表进行查找。定义“唯一”:每次运行该方法时,都会返回不同的字符串?或者所有的角色都是不同的?还有什么吗?我认为这样做不太正确,因为Long.toString会删除前导零。但是,您可以将代码扩展到零填充的短字符串,而不是修剪它们。这很好,但我只需要8个字符,否则我将毫无疑问地使用它。UUID是结构化的;它们的字段是以特定的方式生成的,并非每个位都是唯一的。这意味着你不能仅仅从它们身上切下随机的片段,期望它们保持独特性。请参阅Danny对的评论,以了解此问题的实际说明。@Danny,
String eightChars=unique.substring(28)我生成了两次,FF8081328864BA01328864BC590000和FF8081328864BA02328864BC5902300。如果我只取8个第一个字符,我将得到相同的字符串:(我很好奇,这是如何解决OP的问题的。我在文档中没有看到任何确保唯一性的东西。如果你每秒打电话超过一次,就不是唯一的,而且绝对不是随机的!你好,欢迎这么做!请阅读,我不认为这是PO要求的。请注意,接受的答案是你建议的。你是在添加吗?请阅读。这并不能保证唯一性-考虑并发线程,甚至是单个线程以非常快的速度重复执行此操作
public class RandomValueXML {

    public static void main(String[] args) {
        
        System.out.println(org.apache.commons.lang3.RandomStringUtils.random(6, true, true)); 

    }
    
    static Set<String> getRandomUniqueStrings(int count, int length, boolean letters, boolean numbers){
        Set<String> rus = new HashSet<>();
        
        while (rus.size() < count){
            rus.add(RandomStringUtils.random(length, letters, numbers));
        }
        
        return rus;
    } 
}
long unixTime = System.currentTimeMillis() / 1000L;
String unique_no=Long.toHexString(unixTime).toUpperCase();
System.out.println(UniqueIdGenerator.fromBase10(System.currentTimeMillis()));
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;
 }
}
ifJjuYrR
NpY3TfIU
LGFm8Ng9
sV4Gctb7
4fyhlSuQ