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
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
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
Merak ediyorum, bu OP'nin sorusunu nasıl çözebilirim.Örneğin, benzersizliği sağlayan hiçbir şey göremiyorum – taylorcressy
Ben de bunu merak ediyorum. –
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();
Çok iyi ama sadece 8 karaktere ihtiyacım var, aksi taktirde bunu kullanamayacağım. –
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. –
@danny, [i.e.,] (http://ideone.com/GKniz) 'String eightChars = unique.substring (28); –
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;
}
Hızlı ve kirli çözüm:
public String getRandomString(int length) {
return UUID.randomUUID().toString().subSequence(0, length);
}
İki kez oluşturdum ve ff808181328864ba01328864bc590000 ve ff808181328864ba02328864bc5902300. Ben sadece ilk 8 karakterleri alırsam, aynı dizeyi alacağım :( –
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);
}
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. –
Bu kimlik 'benzersiz' değil – Ilya
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
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 Bycevap 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.
long unixTime = System.currentTimeMillis()/1000L;
String unique_no=Long.toHexString(unixTime).toUpperCase();
, HEX biçiminde benzersiz 8 karakter dizesi Dize verir.
Eğer bir kereden daha fazla ve kesinlikle rastgele değilsen, benzersiz değil! –
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
, "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