2011-10-17 43 views
8

Java'da 8 karakter uzunluğunda rasgele ve benzersiz bir String oluşturmanın bir yolu var mı? 8 karakteristik benzersiz Java in String

String id = getRandomString(); 

ardından Kimliği örnek wf41Av5g

+1

Eğer bunlardan 62^8 daha fazlasını istiyorsanız (sadece alfanümerik istediğinizi varsayarak) ... muhtemelen rastgele bir dize, sonra da önceden oluşturulmuş dizeleri içeren bir tabloya bakmak isteyebilirsiniz. – bdares

+5

, "benzersiz" yi tanımlar: yöntem her çalıştırıldığında farklı bir dizge döndürülür? ya da tüm karakterler birbirinden farklı mı? başka bir şey? – amit

cevap

21

Sen 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)); 

    } 
} 
kullanabilirsiniz
+7

Merak ediyorum, bu OP'nin sorusunu nasıl çözebilirim.Örneğin, benzersizliği sağlayan hiçbir şey göremiyorum – taylorcressy

+0

Ben de bunu merak ediyorum. –

9

benzersizliği özelliği kullanmak hangi kapsama bağlıdır için olacak. Bir evrensel benzersiz tanımlayıcınızın UUID sınıfını kullanabilirsiniz isterseniz rağmen Java kesinlikle rasgele dizeleri üretebilir. java.util.UUID kullanarak

String unique = UUID.randomUUID().toString(); 
+1

Çok iyi ama sadece 8 karaktere ihtiyacım var, aksi taktirde bunu kullanamayacağım. –

+1

UUID'ler yapılandırılmıştır; Onların alanları belirli şekillerde üretilir ve her bit eşit derecede benzersiz değildir. Bu, yalnızca rastgele bitleri parçalayamaz ve benzersiz kalmasını beklemediğiniz anlamına gelir. Bu sorunun eyleminin bir açıklaması için Danny'nin [Oliver'ın cevabı] (http://stackoverflow.com/questions/7791475/8-chars-unique-string-in-java/7791522#7791522) konusundaki görüşünü okuyun. –

+1

@danny, [i.e.,] (http://ideone.com/GKniz) 'String eightChars = unique.substring (28); –

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; 
} 
0

Hızlı ve kirli çözüm:

public String getRandomString(int length) { 
    return UUID.randomUUID().toString().subSequence(0, length); 
} 
+5

İki kez oluşturdum ve ff808181328864ba01328864bc590000 ve ff808181328864ba02328864bc5902300. Ben sadece ilk 8 karakterleri alırsam, aynı dizeyi alacağım :( –

0

Aşağıdaki kodu deneyin:

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

Bence bu doğru bir şey yapmaz * çünkü Long.toString önde gelen sıfırları düşürür, ancak kodu sıfır-pad'e genişletebilirsiniz. –

+0

Bu kimlik 'benzersiz' değil – Ilya

10

Teklik önemliyse, yalnızca rasgele dizeleri oluşturamazsınız. Bir çarpışmayı önlemek için hiçbir yolu yoktur. UUID'ler bile çarpışabilir, ancak bu pek olası değildir.

Kullandığınız dizelerin bir kaydını tutabilirsiniz ve yeni bir rasgele dize oluşturduğunuzda, bir kopya olup olmadığını görmek için kaydı kontrol edin, eğer varsa, atın ve tekrar deneyin.

Ancak ne ben öneririm rasgele sayılar oluşturmak kalmamasıdır. Bunun yerine, bir sayaç tutun ve rastgele görünümlü sayılar üretmek için çıkışını şifreleyin. Bunları doğru yaparsanız, asla çarpışmayacaksınız. an earlier answer of mine veya one by Rossum

2

Bkz Güncel saat tabanında bu dizeyi oluşturabilirsiniz. Örneğin

:

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

Sonra kullanarak alfanümerik karakter için (son ikisi hariç) her iki basamağını çevirebilir tablo o
06 - - - o zaman

14 alacak

(http://en.wikipedia.org/wiki/Base64 hepsi daha küçük 59 olduğuna dikkat) G
04 - E
16 - S
21 - V
20 - U

OGEQVU79 < - tam olarak 8 karakter. Biraz karmaşık, ama sık sık 0'dan fazla işlevini çağırmazsanız çalışır.01 s

şimdi By
0

cevap kazanılmış, ancak bu sayfaya ulaşmak isteyenler için, bu kodu deneyin olmalı: Burada

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; 
} 

}

set kullanımı benzersizliği sağlarken HashSet kullanımı okuma ve yazma sırasında daha iyi performans sağlar.

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

, HEX biçiminde benzersiz 8 karakter dizesi Dize verir.

+0

Eğer bir kereden daha fazla ve kesinlikle rastgele değilsen, benzersiz değil! –