Təsadüfi bir alfasayısal düsturu necə yaratmaq olar?

Pseudo-random alphanumeric string yaratmaq üçün sadə bir Java alqoritmını axtarırdıq. Mənim vəziyyətimdə, 500K+ nəsilində (mənim ehtiyaclarım daha çətin bir şey tələb etmir) benzersiz olma ehtimalı olan unikal bir sessiya / əsas identifikator kimi istifadə ediləcək.

İdeal olaraq, mənim unikallığımdan asılı olaraq uzunluğu müəyyən edə bilərəm. Məsələn, yaradılan bir uzunluqlu 12 simli belə bir şeyə baxa bilər: "AEYGF7K0DM1X" .

1553
03 сент. todd 03 sentyabr ayına təyin olundu . 2008-09-03 05:58 '08 saat 05:58 'da 2008-09-03 05:58
@ 44 cavab
  • 1
  • 2

Alqoritmi

Təsadüfi bir simli yaratmaq üçün, simvol istənilən uzunluğu çatana qədər təsadüfi olaraq mövcud olan simvollardan tərtib olunmuş simvolları birləşdirin.

İcra

Təsadüfi kimliklərin yaranması üçün bəzi olduqca sadə və çox çevik kodlar. Mühüm tətbiq qeydləri üçün aşağıdakı məlumatları oxuyun.

 import java.security.SecureRandom; import java.util.Locale; import java.util.Objects; import java.util.Random; public class RandomString {  public String nextString() { for (int idx = 0; idx < buf.length; ++idx) buf[idx] = symbols[random.nextInt(symbols.length)]; return new String(buf); } public static final String upper = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; public static final String lower = upper.toLowerCase(Locale.ROOT); public static final String digits = "0123456789"; public static final String alphanum = upper + lower + digits; private final Random random; private final char[] symbols; private final char[] buf; public RandomString(int length, Random random, String symbols) { if (length < 1) throw new IllegalArgumentException(); if (symbols.length() < 2) throw new IllegalArgumentException(); this.random = Objects.requireNonNull(random); this.symbols = symbols.toCharArray(); this.buf = new char[length]; }  public RandomString(int length, Random random) { this(length, random, alphanum); }  public RandomString(int length) { this(length, new SecureRandom()); }  public RandomString() { this(21); } } 

İstifadə nümunələri

8 karakterli identifikatorlar üçün təhlükəli generator yaradın:

 RandomString gen = new RandomString(8, ThreadLocalRandom.current()); 

Sessiya kimlikləri üçün təhlükəsiz bir generator yaradın:

 RandomString session = new RandomString(); 

Oxunan çap kodları olan bir generator yaradın. Daha az simvol istifadəsini kompensasiya etmək üçün dizgeler alfanümerik stringsdən daha uzundur:

 String easy = RandomString.digits + "ACEFGHJKLMNPQRUVWXYabcdefhijkprstuvwx"; RandomString tickets = new RandomString(23, new SecureRandom(), easy); 

Sessiya identifikatorları kimi istifadə edin

Benzersiz ola biləcək sessiya identifikatorlarının yaranması kifayət deyil və ya sadə bir sayğacdan istifadə edə bilərsiniz. Öngörülen tanımlayıcılar kullanıldığında saldırganların seanslarını durdurur.

Uzunluq və təhlükəsizlik arasında bir gərginlik var. Daha az xüsusiyyətləri olduğundan daha qısa identifikatorlar tapmaq daha asandır. Lakin daha çox identifikatorlar daha çox yaddaş və bant genişliyi istehlak edir. Böyük bir xarakter dəsti kömək edir, ancaq müəyyənləşdiricilər URL-lər daxil edildikdə və ya əllə girildikdə kodlaşdırma problemlərinə səbəb ola bilər.

Sessiya identifikatorları üçün təsadüfi və ya entropiyanın əsas mənbəyi kriptoqrafiya üçün nəzərdə tutulan təsadüfi sayda generatordan olmalıdır. Lakin, bu generatorların başlanğıcları bəzən hesablamalı şəkildə bahalı və ya yavaş ola bilər, buna görə mümkün olduqda onları təkrar istifadə etmək üçün səy göstərilməlidir.

Nesne tanımlayıcıları olaraq istifadə edin

Hər bir tətbiqdə təhlükəsizlik tələb olunmur. Təsadüfi tapşırıq heç bir koordinasiya və ya ayrılıq olmadan paylanmış sahələrdə identifikatorları yaratmaq üçün çox obyektlərin effektiv bir yol ola bilər. Xüsusilə kümelenmiş və ya yayılmış bir mühitdə koordinasiya yavaş ola bilər və obyektlər çox kiçik və ya çox böyük resurslarla bitdikdə yerin ayrılması problem yaradır.

Onların gözlənilməzliyi ilə hərəkət etmədən yaradılan identifikatorlar, əksər web proqramlarında olduğu kimi, bir təcavüzkarın onları görüntüləyə və manipulyasiya edə biləcəyi təqdirdə digər vasitələrlə qorunmalıdır. Tanınmacının icazəsi olmadan bir təcavüzkar tərəfindən tahmin edilebileceği obyektləri qoruyan ayrı bir avtorizasiya sistemi olmalıdır.

Həm də gözlənilən ümumi identifikator sayını nəzərə alaraq, toqquşmaların çətinləşdirilməsinə kifayət qədər uzun müddət müəyyənləşdirilməlidir. Buna "doğum günü paradoksu" deyilir. Bu toqquşma ehtimalı, p, təxminən n 2 / (2q x ) -ə bərabərdir, burada n - əslində yaranan identifikatorların sayı, q əlifbada müxtəlif simvolların sayıdır və x - identifikatorların uzunluğu. Bu, çox az sayda olmalıdır, məsələn, 2-50 və ya daha az.

Bunları tapmaq, 500 kq-lik 15 xarakterli identifikator arasında bir toqquşma ehtimalının təxminən 2-52 olduğunu göstərir və bu, ehtimal ki, kosmik ray səhvləri və s.

UUID ilə müqayisə

Onların spesifikasiyasına əsasən, UUID-ların gözlənilməz olması nəzərdə tutulmur və iclas identifikatorları kimi istifadə edilməməlidir.

UUID'lar standart formatda bir çox yer tutur: yalnız 122 bant üçün 36 simvol. ("Təsadüfi" UUID-in bütün bitləri təsadüfi seçilmir.) Təsadüfi seçilmiş alfanümerik simli yalnız 21 simvol daxilində daha çox entropi paketləyir.

UUID'lar çevik deyil; onlar standart bir quruluş və yeri var. Bu onların əsas üstünlüyü və onların əsas zəifliyi. Xarici partiya ilə əməkdaşlıq edərkən, UUID tərəfindən təklif olunan standartlaşdırma faydalı ola bilər. Yalnız daxili istifadə üçün onlar təsirsiz ola bilər.

1454
03 сент. cavab erickson verildi 03 Sep. 2008-09-03 07:04 '08 at 07:04 2008-09-03 07:04

Java birbaşa bunu etmək üçün bir yol təqdim edir. Bir çıraq istəmirsinizsə, kəsmək asan. Yalnız uuid.replace("-", "") istifadə uuid.replace("-", "")

 import java.util.UUID; public class randomStringGenerator { public static void main(String[] args) { System.out.println(generateString()); } public static String generateString() { String uuid = UUID.randomUUID().toString(); return "uuid = " + uuid; } } 
border=0

Nəticə:

 uuid = 2d7428a6-b58c-4008-8575-f05549f16316 
769
03 сент. Cavab Steve McLeod tərəfindən verilib 03 Sep. 2008-09-03 17:18 '08 at 17:18 'da 2008-09-03 17:18
 static final String AB = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; static SecureRandom rnd = new SecureRandom(); String randomString( int len ){ StringBuilder sb = new StringBuilder( len ); for( int i = 0; i < len; i++ ) sb.append( AB.charAt( rnd.nextInt(AB.length()) ) ); return sb.toString(); } 
500
01 окт. cavab maxp 01 oct verilir . 2008-10-01 14:36 '08 at 14:36 2008-10-01 14:36

Apache dərslərindən istifadə etməyi xoşbəxt edirsinizsə, org.apache.commons.text.RandomStringGenerator (commons-text) istifadə edə bilərsiniz.

Məsələn:

 RandomStringGenerator randomStringGenerator = new RandomStringGenerator.Builder() .withinRange('0', 'z') .filteredBy(CharacterPredicates.LETTERS, CharacterPredicates.DIGITS) .build(); randomStringGenerator.generate(12); // toUpperCase() if you want 

Commons->RandomStringUtils edilməmişdir.

467
04 сент. cavab cmsherratt 04 sep verilir . 2008-09-04 14:14 '08 saat 02:14 'da 2008-09-04 14:14

Bir xəttdə:

 Long.toHexString(Double.doubleToLongBits(Math.random())); 

http://mynotes.wordpress.com/2009/07/23/java-generating-random-string/

99
17 сент. Cavab anonim verilir 17 İyul. 2009-09-17 18:22 '09 at 6:22 PM 2009-09-17 18:22

Bunun üçün Apache kitabxanasından istifadə edə bilərsiniz: RandomStringUtils

 RandomStringUtils.randomAlphanumeric(20).toUpperCase(); 
95
20 июля '12 в 13:23 2012-07-20 13:23 Cavab manish_s tərəfindən verilir 20, '12 saat 13:23 pm 2012-07-20 13:23

Bu asanlıqla xarici kitabxanalar olmadan əldə edilə bilər.

1. Kriptoqrafik səhv təsadüfi məlumatların yaradılması

Əvvəlcə bir kriptoqrafik PRNG lazımdır. Java'da ən yaxşı qaynaq qaynağı maşın üçün istifadə edilən SecureRandom var (məsələn, /dev/random ). Daha ətraflı oxuyun.

 SecureRandom rnd = new SecureRandom(); byte[] token = new byte[byteLength]; rnd.nextBytes(token); 

Qeyd SecureRandom , Java üçün təsadüfi byte yaratmaq üçün ən yavaş, lakin ən təhlükəsiz bir yoldur. Bununla birlikdə, burada performansımızı nəzərə almadan məsləhət görürəm, çünki ssenaridə milyonlarla tokens yaratmaq lazım deyilsə, adətən tətbiqinizə real təsir göstərmir.

Mümkün olan dəyərlərin lazımi məkanı

Sonra siqnalın nə qədər unikal olduğuna qərar verməlisiniz. Entropiyanın bütün və tək nöqtəsi sistemin kobud qüvvə ilə hücuma məruz qala biləcəyini təmin etməkdir: mümkün dəyərlərin məkanı belə olmalıdır ki, hər hansı bir təcavüzkar quruya quru vaxtda dəyərlərin yalnız bir hissəsini sınayacaqdır1. Təsadüfi UUID kimi unikal identifikatorlar milyardlarla təkrarlama şansından biri olmaq üçün 122 bit entropi (yəni 2 ^ 122 = 5.3 × 10 36) - çarpma ehtimalı "* (...) trilyon versiya 4 UUID yaradılmalıdır ". 128 biti seçəcəyik, çünki bu, 16 baytya bərabərdir və demək olar ki, bütün üçün ən qeyri-adi istifadə halları üçün unikal olmaq üçün böyük hesab olunur və təkrarlananlar haqqında düşünməyə ehtiyac yoxdur. Doğum günü probleminin sadə analizi daxil olmaqla sadə bir entropiya müqayisəsi masası.

2019

28 мая '17 в 15:06 2017-05-28 15:06 Patrickf tərəfindən verilmiş cavab 28 may, '17 'da 15:06 2017-05-28 15:06

dollar istifadə etmək sadə olmalıdır:

 // "0123456789" + "ABCDE...Z" String validCharacters = $('0', '9').join() + $('A', 'Z').join(); String randomString(int length) { return $(validCharacters).shuffle().slice(length).toString(); } @Test public void buildFiveRandomStrings() { for (int i : $(5)) { System.out.println(randomString(12)); } } 

Bu kimi bir şey çıxır:

 DKL1SBH9UJWC JH7P0IT21EA5 5DTI72EO6SFU HQUMJTEBNF7Y 1HCR6SKYWGT7 
41
01 февр. cavab dfa 01 fevral. 2010-02-01 20:12 '10 at 20:12 2010-02-01 20:12

Təəccüblü deyil ki, burada heç kim təklif etməyib, lakin:

 import java.util.UUID UUID.randomUUID().toString(); 

Asan

Bunun üstünlüyü, UUID'in yaxşı və uzun olmasıdır və qarşılaşa bilmək üçün demək olar ki, imkansızdır.

Vikipediyada yaxşı bir şərh var:

"... sonrakı 100 il ərzində hər saniyədə 1 milyard UUID yaradan sonra yalnız bir təkrarlıq yaratma ehtimalı təxminən 50% təşkil edəcək.

http://en.wikipedia.org/wiki/Universally_unique_identifier#Random_UUID_probability_of_duplicates

İlk 4 bit versiya növü və 2 versiyasıdır, buna görə də 122 bit təsadüfi dəyər alırsınız. Buna görə, istəyirsinizsə, UUID ölçüsünü azaltmaq üçün ucundan kəsin. Tövsiyə edilmir, amma hələ də 500k qeydləriniz üçün kifayət qədər çox təsadüf var.

31
25 окт. Oct 25-də Michael Allen tərəfindən verilmiş cavab 2012-10-25 18:45 '12 saat 18:45 'da 2012-10-25 18:45

Burada Java'da var:

 import static java.> 

Burada bir nümunədir:

 scala> RandomAlphaNum.gen(42) res3: java.> 
30
03 сент. Cavab Apocalisp tərəfindən verilib 03 Sep. 2008-09-03 07:37 '08 at 07:37 2008-09-03 07:37

Qısa və sadə həll, lakin yalnız kiçik hərflər və nömrələrdən istifadə edir:

 Random r = new java.util.Random (); String s = Long.toString (r.nextLong ()  Long.MAX_VALUE, 36); 

Ölçü, 12 basamaktan 36 bazaya qədərdir və bu şəkildə daha da inkişaf edə bilməz. Əlbəttə ki, birdən çox nümunə əlavə edə bilərsiniz.

25
17 апр. Cavab istifadəçi bilinmir 17 Apr 2012-04-17 13:08 '12 at 13:08 2012-04-17 13:08

Java 8-ə alternativ:

 static final Random random = new Random(); // Or SecureRandom static final int startChar = (int) '!'; static final int endChar = (int) '~'; static String randomString(final int maxLength) { final int length = random.nextInt(maxLength + 1); return random.ints(length, startChar, endChar + 1) .collect(StringBuilder::new, StringBuilder::appendCodePoint, StringBuilder::append) .toString(); } 
13
25 нояб. Cavab Howard Lovatt 25 noyabrda verildi 2014-11-25 10:23 '14 saat 10:23 'da 2014-11-25 10:23
 public static String generateSessionKey(int length){ String alphabet = new String("0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"); //9 int n = alphabet.length(); //10 String result = new String(); Random r = new Random(); //11 for (int i=0; i<length; i++) //12 result = result + alphabet.charAt(r.nextInt(n)); //13 return result; } 
10
09 окт. Cavab rina 09 oktyabr verilir . 2012-10-09 07:40 '12 at 7:40 2012-10-09 07:40

Bir UUID istifadə etmək təhlükəsiz deyil, çünki bir UUID-in hissələri təsadüfi deyildir. @Erickson proseduru çox səliqəlidir, lakin eyni uzunluğun strings yaradır. Aşağıdakı snippet kifayətdir:

  private static class RandomHolder { static final Random random = new SecureRandom(); public static String randomKey(int length) { return String.format("%"+length+"s", new BigInteger(length*5, random) .toString(32)).replace('\u0020', '0'); } } 

Niyə length*5 seçin? Təsəvvür edin ki, təsadüfi bir uzunluqlu simli sadə bir halda götürürük, buna görə bir təsadüfi xarakter. 0-9 və simvollar az olan təsadüfi bir xarakter almaq üçün hər bir xarakterdən birini almaq üçün 0'dan 35-ə qədər təsadüfi bir nömrəyə ehtiyacımız var. BigInteger 0 to (2^numBits - 1) aralığında bərabər paylanmış təsadüfi bir sıra yaradan bir BigInteger təmin edir. Təəssüf ki, 35, əldə edilə bilən bir ədəd deyil 2 ^ numBits - 1. Beləliklə, iki variant var: ya 2^5-1=31 , ya da 2^6-1=63 ilə getmək. 2^6 seçsəydik, bir çox "əlavə" / "daha uzun" ədəd əldə edəcəyik. Buna görə 2^5 ən yaxşı seçimdir, hətta 4 simvol (wz) itiririk. Müəyyən bir uzunluqlu bir simli yaratmaq üçün sadəcə sayı 2^(length*numBits)-1 istifadə edə bilərik. Son problem, müəyyən bir uzunluğu olan bir simli lazım olsa, təsadüfi bir az sayda meydana gətirə bilər, beləliklə uzunluq razı deyildir, beləliklə, lazımi uzunluqda simli tətbiq etmək lazımdır və sıfırlara gətirib çıxarır.

9
04 июля '15 в 1:07 2015-07-04 01:07 Cavab Kristian Kraljic tərəfindən 04 iyul '15 'də saat 01:07' də verilir
 import java.util.Random; public class passGen{ //Verison 1.0 private static final String dCase = "abcdefghijklmnopqrstuvwxyz"; private static final String uCase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; private static final String sChar = "!@#$%^ private static final String intChar = "0123456789"; private static Random r = new Random(); private static String pass = ""; public static void main (String[] args) { System.out.println ("Generating pass..."); while (pass.length () != 16){ int rPick = r.nextInt(4); if (rPick == 0){ int spot = r.nextInt(25); pass += dCase.charAt(spot); } else if (rPick == 1) { int spot = r.nextInt (25); pass += uCase.charAt(spot); } else if (rPick == 2) { int spot = r.nextInt (7); pass += sChar.charAt(spot); } else if (rPick == 3){ int spot = r.nextInt (9); pass += intChar.charAt (spot); } } System.out.println ("Generated Pass: " + pass); } } 

Demək, bu nə deməkdir, sadəcə simli bir parol əlavə edin ... və bəli, yoxlayın ... çox sadədir. Mən yazdım

9
16 апр. cavab cmpbah 16 aprel verilir 2012-04-16 18:48 '12 at 6:48 PM 2012-04-16 18:48
 import java.util.Date; import java.util.Random; public class RandomGenerator { private static Random random = new Random((new Date()).getTime()); public static String generateRandomString(int length) { char[] values = {'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','0','1','2','3', '4','5','6','7','8','9'}; String out = ""; for (int i=0;i<length;i++) { int idx=random.nextInt(values.length); out += values[idx]; } return out; } } 
7
19 окт. Cavab 19 İyun Jameskittu verilir . 2011-10-19 07:36 '11 at 7:36 2011-10-19 07:36

Təsadüfi hexadecimal kodlanmış simli yaradan bu həlli tapdım. Verilmiş vahid testi mənim əsas istifadə vəziyyətimi dəstəkləyirdi. Baxmayaraq ki, bu, digər cavablardan daha mürəkkəbdir.

  public static synchronized String generateUniqueToken(Integer length){ byte random[] = new byte[length]; Random randomGenerator = new Random(); StringBuffer buffer = new StringBuffer(); randomGenerator.nextBytes(random); for (int j = 0; j < random.length; j++) { byte b1 = (byte) ((random[j]  0xf0) >> 4); byte b2 = (byte) (random[j]  0x0f); if (b1 < 10) buffer.append((char) ('0' + b1)); else buffer.append((char) ('A' + (b1 - 10))); if (b2 < 10) buffer.append((char) ('0' + b2)); else buffer.append((char) ('A' + (b2 - 10))); } return (buffer.toString()); } @Test public void testGenerateUniqueToken(){ Set set = new HashSet(); String token = null; int size = 16;  for (int i=0; i<500000; i++){ token = Utility.generateUniqueToken(size); if (token.length() != size * 2){ fail("Incorrect length"); } else if (set.contains(token)) { fail("Duplicate token generated"); } else{ set.add(token); } } } 
7
03 сент. Cavab Todd 03 Sep verilir. 2008-09-03 17:22 '08 saat 05:22 'de 2008-09-03 17:22
  • Sizin tələblərinizə uyğun string simvollarını dəyişdirin.

  • Sətir dəyişməz. Burada StringBuilder.append simli birləşmədən daha səmərəlidir.


 public static String getRandomString(int length) { final String characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJLMNOPQRSTUVWXYZ1234567890!@#$%^ StringBuilder result = new StringBuilder(); while(length > 0) { Random rand = new Random(); result.append(characters.charAt(rand.nextInt(characters.length()))); length--; } return result.toString(); } 
6
06 февр. dərhal dərin cavab verilir 06 Fevral. 2014-02-06 16:15 '14 saat 16:15 2014-02-06 16:15
 import java.util.*; import javax.swing.*; public class alphanumeric{ public static void main(String args[]){ String nval,lenval; int n,len; nval=JOptionPane.showInputDialog("Enter number of codes you require : "); n=Integer.parseInt(nval); lenval=JOptionPane.showInputDialog("Enter code length you require : "); len=Integer.parseInt(lenval); find(n,len); } public static void find(int n,int length) { String str1="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; StringBuilder sb=new StringBuilder(length); Random r = new Random(); System.out.println("\n\t Unique codes are \n\n"); for(int i=0;i<n;i++){ for(int j=0;j<length;j++){ sb.append(str1.charAt(r.nextInt(str1.length()))); } System.out.println(" "+sb.toString()); sb.delete(0,length); } } } 
6
30 июня '11 в 8:34 2011-06-30 08:34 Cavab Suganya tərəfindən 30 iyun 'da 8:34' də verildi. 2011-06-30 08:34

"Sadə" həll ilə bağlı bu cavabların heç birini sevməyin: S

Mən sadə seçərdim;), saf java, bir liner (entropiya təsadüfi simli uzunluğa və bir sıra simvollara əsaslanır):

 public String randomString(int length, String characterSet) { return IntStream.range(0, length).map(i -> new SecureRandom().nextInt(characterSet.length())).mapToObj(randomInt -> characterSet.substring(randomInt, randomInt + 1)).collect(Collectors.joining()); } @Test public void buildFiveRandomStrings() { for (int q = 0; q < 5; q++) { System.out.println(randomString(10, "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"));//charachterSet can basically be anything } } 

və ya (daha oxunaqlı köhnə yol)

 public String randomString(int length, String characterSet) { StringBuilder sb = new StringBuilder(); //consider using StringBuffer if needed for (int i = 0; i < length; i++) { int randomInt = new SecureRandom().nextInt(characterSet.length()); sb.append(characterSet.substring(randomInt, randomInt + 1)); } return sb.toString(); } @Test public void buildFiveRandomStrings() { for (int q = 0; q < 5; q++) { System.out.println(randomString(10, "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")); //charachterSet can basically be anything } } 

Но, с другой стороны, вы также можете использовать UUID с довольно хорошей энтропией ( https://en.wikipedia.org/wiki/Universally_unique_identifier#Collisions ):

 UUID.randomUUID().toString().replace("-", "") 

Bu kömək edir.

5
ответ дан Patrik Bego 21 февр. '18 в 18:29 2018-02-21 18:29

Вы упоминаете "простой", но на всякий случай кто-то ищет что-то, что отвечает более строгим требованиям безопасности, вы можете взглянуть на jpwgen . jpwgen моделируется после pwgen в Unix и очень настраивается.

5
ответ дан michaelok 10 сент. '11 в 0:23 2011-09-10 00:23

Вы можете использовать следующий код, если ваш пароль обязательно содержит номера буквенных специальных символов:

 private static final String NUMBERS = "0123456789"; private static final String UPPER_ALPHABETS = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; private static final String LOWER_ALPHABETS = "abcdefghijklmnopqrstuvwxyz"; private static final String SPECIALCHARACTERS = "@#$% private static final int MINLENGTHOFPASSWORD = 8; public static String getRandomPassword() { StringBuilder password = new StringBuilder(); int j = 0; for (int i = 0; i < MINLENGTHOFPASSWORD; i++) { password.append(getRandomPasswordCharacters(j)); j++; if (j == 3) { j = 0; } } return password.toString(); } private static String getRandomPasswordCharacters(int pos) { Random randomNum = new Random(); StringBuilder randomChar = new StringBuilder(); switch (pos) { case 0: randomChar.append(NUMBERS.charAt(randomNum.nextInt(NUMBERS.length() - 1))); break; case 1: randomChar.append(UPPER_ALPHABETS.charAt(randomNum.nextInt(UPPER_ALPHABETS.length() - 1))); break; case 2: randomChar.append(SPECIALCHARACTERS.charAt(randomNum.nextInt(SPECIALCHARACTERS.length() - 1))); break; case 3: randomChar.append(LOWER_ALPHABETS.charAt(randomNum.nextInt(LOWER_ALPHABETS.length() - 1))); break; } return randomChar.toString(); } 
4
ответ дан Prasobh.K 01 нояб. '12 в 8:43 2012-11-01 08:43

Вот однострочный код от AbacusUtil

 String.valueOf(CharStream.random('0', 'z').filter(c -> N.isLetterOrDigit(c)).limit(12).toArray()) 

Случайный не означает, что он должен быть уникальным. чтобы получить уникальные строки, используя:

 N.uuid() // eg: "e812e749-cf4c-4959-8ee1-57829a69a80f". length is 36. N.guid() // eg: "0678ce04e18945559ba82ddeccaabfcd". length is 32 without '-' 
4
28 нояб. Cavab, user_3380739 28 noyabr tarixində verilir '16 в 23:25 2016-11-28 23:25

Здесь это решение Scala:

 (for (i <- 0 until rnd.nextInt(64)) yield { ('0' + rnd.nextInt(64)).asInstanceOf[Char] }) mkString("") 
4
ответ дан Ugo Matrangolo 24 июля '12 в 14:11 2012-07-24 14:11

Вы можете использовать класс UUID с его сообщением getLeastSignificantBits() для получения 64 бит случайных данных, а затем преобразовать его в число радикса 36 (т.е. строку, состоящую из 0-9, AZ):

 Long.toString(Math.abs( UUID.randomUUID().getLeastSignificantBits(), 36)); 

Это дает строку длиной до 13 символов. Мы используем Math.abs(), чтобы убедиться, что нет знака минус.

4
ответ дан neuhaus 29 июля '13 в 17:07 2013-07-29 17:07
 public static String randomSeriesForThreeCharacter() { Random r = new Random(); String value=""; char random_Char ; for(int i=0; i<10;i++) { random_Char = (char) (48 + r.nextInt(74)); value=value+random_char; } return value; } 
3
ответ дан duggu 24 дек. '12 в 15:41 2012-12-24 15:41

с использованием библиотеки apache это можно сделать в одной строке

 import org.apache.commons.> 

здесь doc http://commons.apache.org/>

ответ дан hridayesh 15 окт. '12 в 10:52 2012-10-15 10:52

Я думаю, что это самое маленькое решение здесь, или почти одно из самых маленьких:

  public String generateRandomString(int length) { String randomString = ""; final char[] chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890".toCharArray(); final SecureRandom random = new SecureRandom(); for (int i = 0; i < length; i++) { randomString = randomString + chars[random.nextInt(chars.length)]; } return randomString; } 

Код работает очень хорошо. Если вы используете этот метод, я рекомендую вам использовать более 10 символов. Столкновение происходит с использованием 5 символов /30362 итераций. Это заняло 9 секунд.

3
ответ дан FileInputStream 26 нояб. '18 в 21:31 2018-11-26 21:31
 public static String getRandomString(int length) { char[] chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRST".toCharArray(); StringBuilder sb = new StringBuilder(); Random random = new Random(); for (int i = 0; i < chars.length; i++) { char c = chars[random.nextInt(chars.length)]; sb.append(c); } String randomStr = sb.toString(); return randomStr; } 
2
ответ дан Prasad Parab 17 авг. '18 в 16:05 2018-08-17 16:05
 public static String getRandomString(int length) { String randomStr = UUID.randomUUID().toString(); while(randomStr.length() < length) { randomStr += UUID.randomUUID().toString(); } return randomStr.substring(0, length); } 
2
ответ дан Vin Ferothas 03 дек. '12 в 9:40 2012-12-03 09:40
  • 1
  • 2

Другие вопросы по меткам или Задайте вопрос