Vytvorte náhodný alfanumerický reťazec v Kotline

1. Prehľad

V tomto výučbe si ukážeme, ako vygenerovať náhodný alfanumerický kód String v Kotline pomocou troch rôznych prístupov: Java Náhodné, Kotlin Náhodnéa Apache Commons Lang RandomStringUtils.

Potom sa zameriame na pohľad na vysoko výkonný prístup.

2. Závislosti

Predtým, ako sa ponoríme do tutoriálu, pridajme do nášho závislosť Apache Commons Lang pom.xml:

 org.apache.commons commons-lang3 3.8.1 

Ďalej môžeme nastaviť niektoré konštanty pre neskoršie použitie:

konštanta STRING_LENGTH = 10; const val ALPHANUMERIC_REGEX = "[a-zA-Z0-9] +"; 

3. Java Náhodné

Najskôr sa pozrime, ako na to používať Javu Náhodné vygenerovať náhodný String.

V tomto príklade použijeme ThreadLocalRandom ktorá má a Náhodné inštancie na vlákno a záruky proti sporu:

private val charPool: List = ('a' .. 'z') + ('A' .. 'Z') + ('0' .. '9') @Test fun givenAStringLength_whenUsingJava_thenReturnAlphanumericString () {val randomString = ThreadLocalRandom. current () .ints (STRING_LENGTH.toLong (), 0, charPool.size) .asSequence () .map (charPool :: get) .joinToString ("") assert (randomString.matches (Regex (ALPHANUMERIC_REGEX))); assertEquals (STRING_LENGTH, randomString.length); }

V tomto príklade sme získanie 10 náhodných alfanumerických znakov zo skupiny znakov generovaním ich indexov, potom ich spojte a vytvorte náhodný obrázok String.

ThreadLocalRandom je k dispozícii od JDK 7. Mohli by sme použiť java.util.Random namiesto toho. Ale ak viacnásobné vlákna používajú rovnakú inštanciu Náhodné, rovnaké semeno je zdieľané viacerými vláknami, čo spôsobuje spory vlákna.

Avšak ani jedno ThreadLocalRandom ani Náhodné sú kryptograficky bezpečné, pretože je možné uhádnuť ďalšiu hodnotu vrátenú z generátora. Java poskytuje výrazne pomalšie java.security.SecureRandom bezpečne vygenerovať náhodnú hodnotu.

4. Kotlin Náhodné

Od Kotlin 1.3, kotlin.random.Nahodne je k dispozícii ako multiplatformná funkcia. Používa to java.util.Random v JDK 6 a 7, ThreadLocalRandom v JDK 8+ a Matematika. Náhoda v Javascript.

Môžeme dostať náhodný výber String s rovnakým prístupom:

val randomString = (1..STRING_LENGTH) .map {i -> kotlin.random.Random.nextInt (0, charPool.size)} .map (charPool :: get) .joinToString ("");

5. Apache Common Lang

Nakoniec, ak stále používame Kotlin, môžeme využívať knižnice Apache Common Lang na generovanie náhodných súborov String:

@Test fun givenAStringLength_whenUsingApacheCommon_thenReturnAlphanumericString () {val randomString = RandomStringUtils.randomAlphanumeric (STRING_LENGTH); assert (randomString.matches (Regex (ALPHANUMERIC_REGEX))); assertEquals (STRING_LENGTH, randomString.length); }

V tomto príklade jednoducho zavoláme RandomStringUtils.randomAlfanumerický dostať naše String s preddefinovanou dĺžkou.

Mali by sme si to všimnúť RandomStringUtils generovať náhodné hodnoty pomocou java.util.Random, ktorá nie je kryptograficky bezpečná, ako sme diskutovali vyššie. Takže v prípade generovania zabezpečeného tokenu alebo hodnoty môžeme použiť CryptoRandom v kryptomene Apache Commons alebo Java SecureRandom.

Máme návod, ako vygenerovať náhodný obrázok String v Jave, aby sme sa tejto téme venovali podrobnejšie.

6. Výkon

Pozoruhodným aspektom každého z nich je, že volá náš generátor náhodných čísel STRING_LENGTH krát. Ak ich tvoríme veľa Struny alebo dlho Struny, tieto prístupy môžu byť príliš pomalé. S určitým extra úsilím však môžeme jednoducho zavolať náhodnú sekvenciu bajtov a potom ich namapovať na náš char char:

@Test fun givenAStringLength_whenUsingRandomForBytes_thenReturnAlphanumericString () {val random = SecureRandom () val bytes = ByteArray (STRING_LENGTH) random.nextBytes (bytes) val randomString = (0..bytes.size - 1) .map {i --.next (charPool.size)]} .joinToString ("") assert (randomString.matches (Regex (ALPHANUMERIC_REGEX))) assertEquals (STRING_LENGTH, randomString.length)} 

Vďaka čomu je tento prístup silný, je to, zatiaľ čo my stále STRING_LENGTH vyhľadávanie našich charPool, náš náhodný generátor vyvoláme iba raz. Okrem toho, že to bude rýchlejšie, môže to tiež znížiť spor medzi vláknami v zdieľaných inštanciách.

7. Záver

Na záver sme prešli tromi prístupmi k vygenerovaniu náhodného alfanumerického reťazca v Kotline, pričom sme preskúmali ich nuansy. Potom sme zaradili ďalšie stupne, aby sme preskúmali vysoko výkonné riešenie, ktoré je možné opätovne využiť pre API Kotlin a Java.

Ako vždy, kód nájdete na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found